收回时drools 5.5.0-final中的NullPointerException

时间:2013-01-21 12:18:00

标签: nullpointerexception drools

我遇到以下规则的问题:

rule "Término sin Traducción"
    salience -100
    dialect "mvel"
    when
        traductor : TraductorDeEventosTratados()
            eventoGenerico : EventoGenerico() from traductor.eventoGenerico
    then
        System.out.println("Evento generico: " + eventoGenerico);
            traductor.setEventoGenerico( null );
            update( traductor );
            retract( eventoGenerico );
end

在撤消“eventoGenerico”时会导致NullPointerException,就好像它在工作内存中不存在(它实际存在,而另一条规则将eventoGenerico设置为traductor先前):

Exception executing consequence for rule "Término sin Traducción" in RULA_PROV.SYSTEM_RULES: [Error: drools.retract( eventoGenerico ): null]
[Near : {... System.out.println("Evento gen ....}]
             ^
[Line: 1, Column: 1]
        at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
        at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1297)

但是,如果我做了这个小改动就可以正常工作(这证明了eventoGenerico确实存在于工作内存中):

rule "Término sin Traducción"
    salience -100
    dialect "mvel"
    when
        traductor : TraductorDeEventosTratados()
            eventoGenerico : EventoGenerico()
            eventoGenerico2 : EventoGenerico( this == eventoGenerico ) from traductor.eventoGenerico
    then
        System.out.println("Evento generico: " + eventoGenerico);
            traductor.setEventoGenerico( null );
            update( traductor );
            retract( eventoGenerico );
end

它看起来像一个错误,任何想法?

提前致谢

2 个答案:

答案 0 :(得分:1)

你可以收回(traductor),但不能收回eventoGenerico。

问题是eventoGenerico是你的“traductor”事实的属性。你不能收回它,因为你没有在工作记忆中引用这个事实。

您确实插入了一个EventoGenerico对象作为一个单独的事实,但它仅在您引用它的第二个(工作)示例中,因此能够撤消它。

答案 1 :(得分:1)

这似乎是由于使用mvel方言导致的Drools 5.5中的错误。我设法使用这个简单的测试重现您的错误:

爪哇:

Model model = new Model("Model A");
DataSample data = new DataSample(model);
ksession.insert(model);
ksession.insert(data);

ksession.fireAllRules();

Drools的:

rule "Rule 1"
dialect "mvel"
when
    $d: DataSample()
    $m: Model() from $d.model
then
    $d.setModel(null);
    update($d);
    retract($m);
end

如果删除 dialect“mvel”修饰符,则规则将按预期工作。最近在Drools的邮件列表中有一些关于mvel的错误报告。也许这就是其中之一。

最诚挚的问候,