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