有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 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命令来实现这一点:

    B obj = new B();
    List cmds = new ArrayList();        
    cmds.add( CommandFactory.newInsertObject(obj) );
    ksession.execute( CommandFactory.newBatchExecution( cmds ) );
    

    在上面的示例中,fire all rules命令是隐式的

    希望有帮助