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规则,它将允许我将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命令是隐式的。

希望有帮助,

最新更新