我有以下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规则,它将允许我将firstField的文本属性与类B中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);
这些是myrule.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
不幸的是,它不起作用,我做错了什么?提前感谢
因为ksession.execute()
需要Command<T>
而不是简单的B
,所以您的代码甚至会编译,这真的很奇怪:http://docs.jboss.org/drools/release/5.6.0.Final/drools-expert-docs/html/ch03.html#d0e3581在您的简单场景中,您要查找的(我想)是一个插入B
对象的命令和另一个激发所有规则的命令。您可以使用BatchExcecution
命令来实现这一点:
B obj = new B();
List cmds = new ArrayList();
cmds.add( CommandFactory.newInsertObject(obj) );
ksession.execute( CommandFactory.newBatchExecution( cmds ) );
在上面的示例中,fire-all-rules命令是隐式的。
希望有帮助,