在Drools Rule Engine中迭代类对象的列表

时间:2019-02-26 17:43:11

标签: drools drools-guvnor kie-workbench drools-kie-workbench

我使用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

我无法确定我的输入错误还是决策表中的条件错误。

2 个答案:

答案 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对象(大多数情况下称为请求)

致谢