繁体   English   中英

在 then 子句中无法访问 Drools 变量

[英]Drools variable cannot be accessed in then clause

我有一个带有几个字段和方法的对象类,我可以在 when 子句中成功访问它们:

public final class ObjectWrapper {

   private Object object;
   private Date approvalDate;
   
   public getObject() {
       return object;
   }
   
   <remaining getters and setters>

}

这类似于我的drools规则的结构:

rule "IS_ELIGIBLE"
when
    ObjectWrapper(
                  $object : getObject(),
                  <remaining conditions>
                 )
then
    System.out.println($object);
end

IntelliJ 立即抱怨告诉我它无法解析符号$object 如果我执行以下操作,该变量似乎只能访问,但无法从 Wrapper 上下文外部访问getObject()方法。

rule "IS_ELIGIBLE"
when
    $object : getObject(),
    ObjectWrapper(
                  <remaining conditions>
                 )
then
    System.out.println($object);
end

使用drools框架处理变量的正确方法是什么? 是否可以在外部声明变量,然后在包装器内更改其值?

项目中还有其他 drools 文件,上面的代码可以工作,但对于那个,如果变量在包装类之外声明,则只能在then子句中访问。

IntelliJ 的代码格式非常好,但它也有一些已知的错误,出版商对修复它并不是特别感兴趣。 仅仅因为代码格式化程序说它是错误的并不意味着它实际上是(尽管它通常是正确的)。对它的建议持保留态度。

根据您显示的内容,您的规则的正确语法应该是这样的:

rule "IS_ELIGIBLE"
when
    ObjectWrapper( $object: object,
                  <remaining conditions>
                 )
then
    System.out.println($object);
end

当你有ObjectWrapper( $o: object )类的东西时,Drools 将首先查找一个名为object的公共变量,然后查找一个名为getObject的方法(基本上遵循 bean 命名约定。)通常只有一次你会调用方法将用于不符合命名约定的东西......例如,如果你有一个doFoo() ,它返回一个你想要分配结果的布尔值。

如图所示的规则( ObjectWrapper( $object: getObject() ) )也可以正常工作。 代码格式化程序只是混淆了。 我提供的版本在语法上是等效的,并且更像“Drools-like”,但是您所展示的内容并没有错。

尝试这个:

rule "IS_ELIGIBLE"
when
    object : ObjectWrapper( object : getObject(),
                  <remaining conditions>
                 ) 
    
then
    System.out.println(object.getObject());
end

ObjectWrapper 的 getObject() 方法也应该有返回类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM