Drools规则引擎中类对象的迭代列表问题
我使用Kie Workbench学习口水。 我的输入将是opportunityProduct类中的名称,我期待 Opportunity类中Ip中的输出。在规则引擎执行之后,我在输出中只得到空值 Pojo结构:Drools规则引擎中类对象的迭代列表问题,drools,drools-guvnor,kie-workbench,drools-kie-workbench,Drools,Drools Guvnor,Kie Workbench,Drools Kie Workbench,我使用Kie Workbench学习口水。 我的输入将是opportunityProduct类中的名称,我期待 Opportunity类中Ip中的输出。在规则引擎执行之后,我在输出中只得到空值 Pojo结构: Opportunity.Java : private java.lang.Boolean result; private java.lang.String ip; private java.util.List<com.sample2.sampledemo2.O
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"
rule "Origination"
when
o:Opportunity(pd: productlist)
(OpportunityProduct(name == "abc" , this memberOf pd))
then
o.setIp("IPP");
end
输出:
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"
rule "Origination"
when
o:Opportunity(pd: productlist)
(OpportunityProduct(name == "abc" , this memberOf pd))
then
o.setIp("IPP");
end
决策表:
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"
rule "Origination"
when
o:Opportunity(pd: productlist)
(OpportunityProduct(name == "abc" , this memberOf pd))
then
o.setIp("IPP");
end
Drl:
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"
rule "Origination"
when
o:Opportunity(pd: productlist)
(OpportunityProduct(name == "abc" , this memberOf pd))
then
o.setIp("IPP");
end
我无法确定我的输入是否错误或决策表中的条件是否错误。在您的输入中,您发送了一个要插入的
Opportunity
对象,但您从未插入OpportunityProduct
事实。你的规则需要两个事实才能生效
请记住,在Drools中,您只能对已插入会话的事实进行推理,并且事实中的嵌套对象不是事实本身
如果您不打算将OpportunityProduct
作为独立事实插入,您可以做的一件事是使用from
条件元素对非事实数据进行推理:
rule "Origination"
when
o:Opportunity(pd: productlist)
OpportunityProduct(name == "abc") from pd
then
o.setIp("IPP");
end
希望有帮助,在您的输入中,您发送了一个要插入的
Opportunity
对象,但您从未插入OpportunityProduct
事实。你的规则需要两个事实才能生效
请记住,在Drools中,您只能对已插入会话的事实进行推理,并且事实中的嵌套对象不是事实本身
如果您不打算将OpportunityProduct
作为独立事实插入,您可以做的一件事是使用from
条件元素对非事实数据进行推理:
rule "Origination"
when
o:Opportunity(pd: productlist)
OpportunityProduct(name == "abc") from pd
then
o.setIp("IPP");
end
希望能有所帮助,这是由于kie服务器rest界面默认工作方式如下: 1) 在客户端A与B相关(A.B=B) 2) 先插入A,然后插入B 3) 在服务器端,每个insert命令都将有: 3.1)与B1实例(未插入)相关的A对象(插入kie会话) 3.2)另一个B2实例(B1的确切副本内容,但与A无关) 这里有两种解决方案: 1) 生活在这样的环境中,并从中受益 2) 做你自己的kie服务器扩展,我就是这么做的。我的所有客户都在使用这种kie服务器,通过反射插入所有连接到顶级对象的java对象(大多数情况下称为请求)
这是因为默认情况下kie服务器rest接口的工作方式如下: 1) 在客户端A与B相关(A.B=B) 2) 先插入A,然后插入B 3) 在服务器端,每个insert命令都将有: 3.1)与B1实例(未插入)相关的A对象(插入kie会话) 3.2)另一个B2实例(B1的确切副本内容,但与A无关) 这里有两种解决方案: 1) 生活在这样的环境中,并从中受益 2) 做你自己的kie服务器扩展,我就是这么做的。我的所有客户都在使用这种kie服务器,通过反射插入所有连接到顶级对象的java对象(大多数情况下称为请求) 问候