Java 无法将来自NodeLeftTuple的Drools强制转换为ReactiveFromNodeLeftTuple

Java 无法将来自NodeLeftTuple的Drools强制转换为ReactiveFromNodeLeftTuple,java,drools,rule-engine,Java,Drools,Rule Engine,我想知道是否有人能给我一些建议。当我试图从Javacode修改反应模型对象的属性时,下面出现了一个异常 java.lang.ClassCastException: org.drools.core.reteoo.FromNodeLeftTuple cannot be cast to org.drools.core.reteoo.ReactiveFromNodeLeftTuple at org.drools.core.phreak.ReactiveObjectUtil.notifyModificat

我想知道是否有人能给我一些建议。当我试图从
Java
code修改反应模型对象的属性时,下面出现了一个异常

java.lang.ClassCastException: org.drools.core.reteoo.FromNodeLeftTuple cannot be cast to org.drools.core.reteoo.ReactiveFromNodeLeftTuple
at org.drools.core.phreak.ReactiveObjectUtil.notifyModification(ReactiveObjectUtil.java:47)
at org.drools.core.phreak.ReactiveObjectUtil.notifyModification(ReactiveObjectUtil.java:42)
at org.drools.core.phreak.AbstractReactiveObject.notifyModification(AbstractReactiveObject.java:41)
at org.drools.compiler.oopath.model.Person.setAge(Person.java:50)
at org.drools.compiler.oopath.OOPathReactiveTests.testSetter2Rules(OOPathReactiveTests.java:127)
我创建了以下测试来重现问题,代码可以插入7.1.0-SNAPSHOT中drools编译器模块中的
org.drools.compiler.oopath.OOPathReactiveTests

当只有一条规则(请参见
testSetter1Rule()
)时不会发生这种情况,而更多的规则(
testSetter2Rules()
)会发生这种情况

我想知道这是一个bug还是我用错了方法。 多谢各位


Peter将问题发布到


drools开发人员在

中很快修复了这个问题,一些x.y-Snapshot是从正在进行的开发中获取的版本。如果你把你的发现发布在Drools邮件列表上会更好。@laune谢谢你,我这么做了。这个问题在
public class OOPathReactiveTests {

@Test
public void testSetter1Rule() {
    String header =
        "import org.drools.compiler.oopath.model.*;\n" +
            "global java.util.List list\n\n";

    String drl1 =
        "rule R1 when\n" +
            "  Man( $m: /wife[age == 25] )\n" +
            "then\n" +
            "  list.add($m.getName());\n" +
            "end\n\n";

    final KieSession ksession = new KieHelper()
        .addContent( header + drl1, ResourceType.DRL )
        .build()
        .newKieSession();

    final List<String> list = new ArrayList<>();
    ksession.setGlobal( "list", list );

    final Man bob = new Man("John", 25);
    bob.setWife( new Woman("Jane", 25) );

    ksession.insert( bob );
    ksession.fireAllRules();

    bob.getWife().setAge(26);
    ksession.fireAllRules();

    Assertions.assertThat(list).containsExactlyInAnyOrder("Jane");
}

@Test
public void testSetter2Rules() {
    String header =
        "import org.drools.compiler.oopath.model.*;\n" +
            "global java.util.List list\n\n";

    String drl1 =
        "rule R1 when\n" +
            "  Man( $m: /wife[age == 25] )\n" +
            "then\n" +
            "  list.add($m.getName());\n" +
            "end\n\n";

    String drl2 =
        "rule R2 when\n" +
            "  Man( $m: /wife[age == 26] )\n" +
            "then\n" +
            "  list.add($m.getName());\n" +
            "end\n\n";

    final KieSession ksession = new KieHelper()
        .addContent( header + drl1 + drl2, ResourceType.DRL )
        .build()
        .newKieSession();

    final List<String> list = new ArrayList<>();
    ksession.setGlobal( "list", list );

    final Man bob = new Man("John", 25);
    bob.setWife( new Woman("Jane", 25) );

    ksession.insert( bob );
    ksession.fireAllRules();

    bob.getWife().setAge(26);
    ksession.fireAllRules();

    Assertions.assertThat(list).containsExactlyInAnyOrder("Jane", "Jane");
}
leftTuples = {HashSet@3461}  size = 2
 0 = {FromNodeLeftTuple@3463} "[fact 0:1:1288815068:1288815068:1:DEFAULT:NON_TRAIT:org.drools.compiler.oopath.model.Man:John]"
 1 = {ReactiveFromNodeLeftTuple@3469} "[fact 0:1:1288815068:1288815068:1:DEFAULT:NON_TRAIT:org.drools.compiler.oopath.model.Man:John]"