Перебор списка объектов класса в Drools Rule Engine
Я изучаю Drools с помощью Kie Workbench. мой ввод будет именем внутри класса возможностей продукта, и я ожидаю, что выход в Ip внутри класса возможностей. после выполнения механизма правил я получаю только нулевое значение на выходе.
Pojo Struture:
Opportunity.Java :
private java.lang.Boolean result;
private java.lang.String ip;
private java.util.List<com.sample2.sampledemo2.OpportunityProduct> productlist;
OpportunityProduct.Java
private java.lang.String name;
Входные данные :
{
"commands":[
{
"insert":{
"out-identifier":"com.sample2.sampledemo2.Opportunity",
"return-object":true,
"object":{
"com.sample2.sampledemo2.Opportunity":{
"productlist":[
{
"name":"abc"
}
]
}
}
}
},
{
"fire-all-rules":""
}
]
}
Выход:
{
"type":"SUCCESS",
"msg":"Container abcdef successfully called.",
"result":{
"execution-results":{
"results":[
{
"key":"",
"value":0
},
{
"key":"com.sample2.sampledemo2.Opportunity",
"value":{
"com..sample2.sampledemo2.Opportunity":{
"result":null,
"ip":null,
"productlist":[
{
"name":"abc"
}
]
}
}
}
],
"facts":[
{
"key":"com.sample2.sampledemo2.Opportunity",
"value":{
"org.drools.core.common.DefaultFactHandle":{
"external-form":"0:2:1366747666:1366747666:2:DEFAULT:NON_TRAIT:com.sample2.sampledemo2.Opportunity"
}
}
}
]
}
}
}
Таблица решений:
NAME CONDITION ACTION
o:Opportunity(pd: productlist)
OpportunityProduct
(name == $param , this memberOf pd) o.setIp($param);
Origination "abc" "IPP"
Drl:
rule "Origination"
when
o:Opportunity(pd: productlist)
(OpportunityProduct(name == "abc" , this memberOf pd))
then
o.setIp("IPP");
end
Я не смог определить, является ли мой ввод неправильным или условие в таблице решений неверным.
1 ответ
В ваш вход вы отправляете Opportunity
объект для вставки, но вы никогда не вставляете OpportunityProduct
факт. Ваше правило нуждается в обоих фактах, чтобы стрелять.
Помните, что в Drools вы можете рассуждать только о фактах, которые были вставлены в ваш сеанс, и что вложенные объекты внутри факта не являются самими фактами.
Если вы не планируете вставлять OpportunityProduct
как независимые факты, вы можете использовать from
условный элемент к рассуждению о данных, который не является фактом:
rule "Origination"
when
o:Opportunity(pd: productlist)
OpportunityProduct(name == "abc") from pd
then
o.setIp("IPP");
end
Надеюсь, поможет,
Это связано с тем, что по умолчанию интерфейс отдыха kie-server работает так:
1) На стороне клиента A, связанный с B (Ab=b)
2) Вы вставляете A, а затем B
3) на стороне сервера для каждой команды вставки будет:
3.1) объект A (вставленный в kie-сессию), связанный с экземпляром B1 (который не вставлен)
3.2) другой экземпляр B2 (точная копия содержимого B1, но не связанного с A)
Вот два решения:
1) Живите с этим и используйте от
2) создайте собственное расширение kie-server, и это то, что я делаю в своем проекте с открытым исходным кодом, чтобы облегчить жизнь с помощью слюни. Все мои клиенты используют этот тип kie-server, вставляя путем отражения все java-объекты, подключенные к верхнему объекту (большую часть времени это называется запросом)
С уважением