【问题标题】:Instancof not working in drools rule engine drl fileInstancof 在流口水规则引擎 drl 文件中不起作用
【发布时间】:2019-12-17 11:05:26
【问题描述】:

我将一个列表List<ArrayList> list = new ArrayList<>(); 传递给drools,内部数组列表包含TaxPayer 类的对象,我的规则就像

rule "test1"
when
    $l:TaxList($k : list)
    $b:ArrayList() from $k
    $a:Object() from $b
then
    if($a instanceof TaxPayer){
        $b.add(new TaxPayer(7,6,5,4,3,2,1));
    }
    if($a instanceof Object){
        $b.add(new TaxPayer(1,2,3,4,5,6,7));
    }

end

第二个 if 工作正常,但即使它是 TaxPayer 的一个实例,它也不会进入第一个

【问题讨论】:

  • 所以我发现了问题,jackon没有足够的关于arraylist的信息来序列化它,所以它使用默认的LinkedhashMap作为它的类

标签: drools rule-engine business-rules


【解决方案1】:

我尝试将上述规则执行为:

rule "test"
when
    $c : TaxList($list : list)
    $b : ArrayList()  from $list
    $testobj: Object() from $b
then
    if ($testobj instanceof TaxPayer){
        System.out.println("inside if 1");
    }
    if ($testobj instanceof Object) {
        System.out.println("inside if 2 ");
    }
end

它对我来说很好用。我得到的输出是:

inside if 1
inside if 2 
inside if 1
inside if 2 ...

您能否详细说明您的问题并将相应的 java 代码添加到问题中,以便我能够理解您如何将对象插入到 drools 会话中。请添加 Java 代码 sn-p 和 TaxList 类。

编辑:

Main.java:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        KieServices kieServices = KieServices.Factory.get();
        KieContainer kieContainer = kieServices.newKieClasspathContainer();
        KieSession kieSession = kieContainer.newKieSession("test");
        ArrayList<TaxPayer> taxPayers = new ArrayList<>();
        taxPayers.add(new TaxPayer(1));
        taxPayers.add(new TaxPayer(2));
        ArrayList<ArrayList> arrayLists = new ArrayList<>();
        arrayLists.add(taxPayers);
        TaxList taxList = new TaxList(arrayLists);
        kieSession.insert(taxList);
        kieSession.fireAllRules();
    }
}

TaxList.java:

import java.util.ArrayList;

public class TaxList {
    ArrayList<ArrayList> list = new ArrayList<>();


    public TaxList(ArrayList<ArrayList> list) {
        this.list = list;
    }

    public ArrayList<ArrayList> getList() {
        return list;
    }

    public void setList(ArrayList<ArrayList> list) {
        this.list = list;
    }
}

TaxPayer.java:

public class TaxPayer {
    private int id;

    public TaxPayer(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

【讨论】:

  • 从您的代码中,我发现您正在将 TaxPayer 对象插入到流口水工作内存中,而在规则中您期望将 TaxList 作为事件。尝试在工作内存中插入 TaskList。
  • 我通过了 TaxList ,但它仍然无法正常工作,您能说明您是如何编写客户端代码的
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 2011-12-06
  • 2016-06-15
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
相关资源
最近更新 更多