![](/img/trans.png)
[英]Runtime Exception with Drools(java.lang.ClassCastException: org.drools.io.impl.ClassPathResource cannot be cast to org.drools.io.InternalResource)
[英]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.