java Drools用于比较两个POJO的两个字段的规则
我有以下Java类:
public class A {
private String text;
public A(){
}
public void setText(String text) {
this.text=text;
}
public String getText() {
return text;
}
}
及
public class B {
private A firstField;
private A secondField;
private Boolean success = false;
public B(){
}
public void setFirstField(A firstField) {
this.firstField=firstField;
}
public A getFirstField(){
return firstField;
}
public void setSecondField(A secondField) {
this.secondField=secondField;
}
public A getSecondField(){
return secondField;
}
public void setSuccess(Boolean success) {
this.success=success;
}
public Boolean isSuccess(){
return success;
}
}
我正在尝试编写Drools规则,该规则允许我比较类B中firstField和secondField的文本属性。这是我的java代码:
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("myrule.drl"), ResourceType.DRL);
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
B obj = new B();
ksession.execute(obj);
这些是我规则的内容。drl:
package test
import my.package.A
import my.package.B
rule "myrule"
no-loop
when
$obj : B(firstField.getText().equals(secondField.getText()))
then
modify($obj){
setSuccess((Boolean)true);
}
end
不幸的是,这不起作用,我做错了什么?提前谢谢
# 1 楼答案
非常奇怪的是,您的代码甚至可以编译,因为
ksession.execute()
需要一个Command<T>
而不是一个简单的B
:http://docs.jboss.org/drools/release/5.6.0.Final/drools-expert-docs/html/ch03.html#d0e3581 在您的简单场景中,您需要(我猜)一个命令来插入B
对象,另一个命令来触发所有规则。 您可以通过使用BatchExcecution
命令来实现这一点:在上面的示例中,fire all rules命令是隐式的
希望有帮助