Я передаю список List<ArrayList> list = new ArrayList<>(); в слюни, а внутренний массив содержит объекты класса 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

Второй если работает нормально, а в первый не идет, хотя это экземпляр TaxPayer

0
Sunil Bhagat 17 Дек 2019 в 14:05
Поэтому я обнаружил проблему, у jackon недостаточно информации о arraylist для его сериализации, поэтому он использует LinkedhashMap по умолчанию в качестве своего класса.
 – 
Sunil Bhagat
17 Дек 2019 в 14:53

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 и класс 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;
    }
}
0
Prog_G 19 Дек 2019 в 09:36
Вы можете увидеть здесь gist.github.com/uchia-itachi/6c11b68a3a79c305c55733a770c7ac10
 – 
Sunil Bhagat
18 Дек 2019 в 13:22
1
Из вашего кода я обнаружил, что вы вставляете объект TaxPayer в рабочую память drools, тогда как в правиле вы ожидаете TaxList как событие. Попробуйте вставить TaskList в рабочую память.
 – 
Prog_G
18 Дек 2019 в 15:01
Я прошел TaxList, но он все еще не работает, можете ли вы показать, как вы написали код на стороне клиента?
 – 
Sunil Bhagat
18 Дек 2019 в 21:27