我使用Kie Workbench学习Drools。 我的输入将是有机产品类中的名称,我期望 机会类中Ip的输出。规则引擎执行后,我在输出中仅得到空值。
Pojo结构:
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
我无法确定我的输入错误还是决策表中的条件错误。
答案 0 :(得分:0)
在输入中,您正在发送要插入的Opportunity
对象,但从未插入OpportunityProduct
事实。您的规则需要两个事实才能触发。
请记住,在Drools中,您只能推断已插入到会话中的事实,并且事实内的嵌套对象本身不是事实。
如果您不打算插入OpportunityProduct
作为独立事实,您可以做的一件事就是使用from
条件元素来推断不是事实的数据:
rule "Origination"
when
o:Opportunity(pd: productlist)
OpportunityProduct(name == "abc") from pd
then
o.setIp("IPP");
end
希望有帮助,
答案 1 :(得分:0)
这是由于默认情况下,kie-server rest接口的工作方式如下:
1)在与B相关的客户端A(A.b = b)
2)依次插入A和B
3)在服务器端,每个插入命令都会有一个:
3.1)与B1实例(未插入)相关的A对象(插入到kie会话中)
3.2)另一个B2实例(B1的确切副本内容,但与A不相关)
这里有两种解决方案:
1)忍受并使用
2)进行您自己的kie-server扩展,这就是我的工作on my open source project to make life easier with drools 。我所有的客户都在使用这种kie-server,可以通过反射插入连接到顶部对象的Java对象(大多数情况下称为请求)
致谢