InstanceCof在drools规则引擎drl文件中不工作
我正在传递一个listInstanceCof在drools规则引擎drl文件中不工作,drools,rule-engine,business-rules,Drools,Rule Engine,Business Rules,我正在传递一个listlist list=new ArrayList()到drools,内部arraylist包含类的对象,我的规则如下 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));
list list=new ArrayList()代码>到drools,内部arraylist包含类的对象,我的规则如下
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运行良好,但第一个if不运行,即使它是纳税人的实例我尝试执行上述规则,如下所示:
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代码片段和TaxList类
编辑:
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();
}
}
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;
}
}
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;
}
}
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();
}
}
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;
}
}
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;
}
}
所以我发现了问题,jackon没有足够的关于arraylist的信息来序列化它,所以它使用Deafolt的LinkedhashMap作为它的类。你可以从你的代码中看到,我发现你正在将纳税人对象插入drools工作内存,而在规则中,你期望一个TaxList作为事件。尝试在工作内存中插入TaskList。我通过了TaxList,但它仍然不起作用,你能告诉我你是如何编写客户端代码的吗