在RHS中检查drools中pojo内是否存在字段

在RHS中检查drools中pojo内是否存在字段,drools,Drools,我不太会流口水。 我想在RHS中检查POJO中是否存在字段 { "category": [ { "nlp": [ { "mainCategory": "Politics" } ], "crawler": [ { "isNLP": true, "mainCategory": "Politics" } ] }

我不太会流口水。 我想在RHS中检查POJO中是否存在字段

 {
  "category": [
    {
      "nlp": [
        {
          "mainCategory": "Politics"
        }
      ],
      "crawler": [
        {
          "isNLP": true,
          "mainCategory": "Politics"
        }
      ]
    }
  ]
}
这是生成的pojo的列表

  • EsRootDoc.java
  • Crawler.java
  • Nlp.java
  • EsRootDoc是具有方法和字段的主类

        $RHSmap1:EsRootDoc()
        and
    
        $map1:EsRootDoc($categorylist1:category)
    
        $category2:Category($nlplist2:nlp) from $categorylist1
    
        $nlp2:Nlp(mainCategory=="politics") from $nlplist2
    
    
    
    then
    
        $RHSmap1.setEvent("fight");
    
    end`
    
    这给了我以下的错误

    [错误:无法使用严格模式解析方法:com.orkash.EnrichmentService.EnrichmentController.tempJsonToClass.EsRootDoc.setEvent(java.lang.String)] [近:{…$RHSmap1.setEvent(“打架”);…}]


    我需要在RHS中提供一个检查:-如果EsRootDoc有一个字段事件或没有,则Drools中没有任何内容(据我所知)允许您执行所需操作。规则的RHS几乎是纯Java。基本规则是:如果不能在Java中完成,就不能在Drools中的规则的RHS中完成

    好消息是,可以使用反射在Java中实现您想要做的事情。我建议您创建一个helper类,该类使用反射来设置对象中某个属性(如果该属性存在)的值。您的规则如下所示:

    rule 'Some Rule'
    when
        $RHSmap1:EsRootDoc()
        $map1:EsRootDoc($categorylist1:category)
        $category2:Category($nlplist2:nlp) from $categorylist1
        $nlp2:Nlp(mainCategory=="politics") from $nlplist2
    then
        Helper.setAttribute($RHSmap1, "event", "fight");
    end
    

    希望有帮助,

    规则的RHS是强类型的。您的
    EsRootDoc
    类是否有
    setEvent(String)
    方法?否,它没有此方法。我的用例是,在调用setter方法之前,我需要提供一个检查,如果EsRootDoc有event字段,那么只有它应该调用setEvent(String)方法,在普通Java中,您将如何做到这一点?您的
    EsRootDocument
    类看起来怎么样?我假设它的某些子类有这个方法,而其他一些子类没有。对吗?如果您正在动态生成规则和类,那么您可以使用反射来检查setter是否存在并调用它。实际上,EsRootDoc没有字段category,而category是另一个具有字段nlp和crawler的类。Nlp是另一个拥有mainCategory的类,我正在动态生成类,但我希望规则应该静态生成。所以我想在drl中提供一个检查,这样,如果EsRootDoc中有事件,是否有任何方法可以将内容保存在drool变量中,然后检查如果事件存在,那么只调用setter方法