首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Drools规则引擎中迭代类对象列表

在Drools规则引擎中迭代类对象列表
EN

Stack Overflow用户
提问于 2019-02-26 17:43:10
回答 2查看 2.7K关注 0票数 0

我用Kie工作台学习流口水。我的输入将是opportunityProduct类中的名称,并且我期待在Ip中的机会类中的输出。在规则引擎执行之后,输出中只得到空值。

Pojo结构:

代码语言:javascript
复制
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;

输入:

代码语言:javascript
复制
{
   "commands":[
      {
         "insert":{
            "out-identifier":"com.sample2.sampledemo2.Opportunity",
            "return-object":true,
            "object":{
               "com.sample2.sampledemo2.Opportunity":{
                  "productlist":[
                     {
                        "name":"abc"
                     }
                  ]
               }
            }
         }
      },
      {
         "fire-all-rules":""
      }
   ]
}

输出:

代码语言:javascript
复制
{
   "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"
                  }
               }
            }
         ]
      }
   }
}

决策表:

代码语言:javascript
复制
NAME                  CONDITION                               ACTION

           o:Opportunity(pd: productlist)
             OpportunityProduct
      (name == $param , this memberOf pd)      o.setIp($param);

Origination  "abc"                                  "IPP"

Drl :

代码语言:javascript
复制
rule "Origination"
    when
        o:Opportunity(pd: productlist)
        (OpportunityProduct(name == "abc" , this memberOf pd))
    then
        o.setIp("IPP");
end

我无法识别我的输入是错误的,还是决策表中的条件是错误的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-27 13:15:28

在您的输入中,您将发送要插入的Opportunity对象,但永远不会插入OpportunityProduct事实。你的规则需要两个事实才能开火。

请记住,在Drools中,您只能对插入到会话中的事实进行推理,并且事实中的嵌套对象不是事实(本身)。

如果您不打算将OpportunityProduct作为独立事实插入,您可以做的一件事是使用from条件元素对非事实的数据进行推理:

代码语言:javascript
复制
rule "Origination"
    when
        o:Opportunity(pd: productlist)
        OpportunityProduct(name == "abc") from pd
    then
        o.setIp("IPP");
end

希望能帮上忙

票数 2
EN

Stack Overflow用户

发布于 2020-02-28 13:40:37

这是因为默认情况下,kie-server rest接口的工作方式如下:

( 1)与B (A.b=b)有关的客户端A

2)插入A,然后插入B

3)在服务器端,对于每个insert命令都有如下内容:

3.1)与B1实例相关的对象(插入到kie会话中)(未插入)

3.2)另一个B2实例( B1的确切副本内容但与A无关)

这里有两个解决方案:

1)生活在这种环境中,并使用于

2)做您自己的kie服务器扩展,这就是我所做的在我的开源项目上,让流口水让生活更轻松。。我的所有客户都在使用这种kie-server woth,通过反射插入所有连接到顶级对象的java对象(大多数情况下称为请求)。

问候

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54891286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档