繁体   English   中英

Drools FromNodeLeftTuple无法转换为ReactiveFromNodeLeftTuple

[英]Drools FromNodeLeftTuple cannot be cast to ReactiveFromNodeLeftTuple

我想知道是否有人可以给我建议。 尝试从Java代码修改反应模型对象的属性时,下面出现异常。

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)

我创建了以下测试来重现该问题,可以将代码插入drools-compiler module in 7.1.0-SNAPSHOT org.drools.compiler.oopath.OOPathReactiveTests中。

当只有1条规则时,它不会发生(请参阅testSetter1Rule() ),而在有更多规则时,它将发生( testSetter2Rules() )。

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");
}

发生异常时,Jane的leftTuples是:

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]"

我想知道这是一个错误还是我使用错误的方式。 非常感谢你。

彼得

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM