【问题标题】:Drools functions流口水功能
【发布时间】:2012-09-18 06:09:47
【问题描述】:

最近我正在使用流口水,我想对某些对象进行一些特殊检查。我需要使用规则的when 部分中的函数,但出现错误。示例:

function boolean newFunction(int a){
  if(a>0)
    return true;
  else
    return false;
}

rule "new rule"
salience 100
dialect "mvel"
when
  eval(newFunction(1))
then
  System.out.println("OK");
end

我总是得到的错误是:

unable to resolve method using strict-mode: java.lang.Object.newFunction(java.lang.Integer)

whensection 中的函数不支持流口水吗?

谢谢!

【问题讨论】:

  • 如答案中所述,Drools 函数不适用于 LHS。但是,我假设您之所以问这个问题是因为您实际上是在寻求在 LHS 中实现代码的重用。为此,您可以使用“extends”关键字。即rule "a rule" extends "another rule"。不幸的是,Drools 文档中没有提到这个相当有用的功能。

标签: java function drools


【解决方案1】:

简短的回答是:不。

这是因为事实需要在工作记忆中。

您可以做的是制定一个规则,该规则从工作内存中获取某个类的所有类型,在 then 部分中应用一个函数并将该新值插入工作内存中。

编辑

这个答案最初发布于 2012 年,由于较新版本的 drools 确实支持 when 子句上的功能,因此相关性并不高。

【讨论】:

    【解决方案2】:

    很可能是 MVEL 或集成错误 - 函数调用适配器没有装箱/拆箱原始类型。 我看到这个问题已经很老了,但问题已经得到解决(用 6.3.0-SNAPSHOT 测试)。对于旧版本,我会尝试使用盒装类型:function boolean newFunction(Integer a) ...

    【讨论】:

      【解决方案3】:

      按照上面选择的答案,经过一些实验,我发现可以创建一个外部java方法,它的类可以导入到规则文件中,并包装在一个MVEL函数包装器(布尔值)中,它可以then 可以作为参数从 LHS 调用到 eval 语句。

      [External Java POJO_Class.myMethod]
      
      
      import com.mypackage.POJO_Class;
      
      
      function Boolean myFunctionName() {
         POJO_Class myClass = new POJO_Class();
         return myClass.myMethod(Parameters);
      }
      
      
      
      rule "Test Rule"
          when
            eval ( myFunctionName(parameters) )
          then
      end
      

      【讨论】:

        【解决方案4】:

        我不确定您为什么会收到您遇到的错误,但我昨天在查询中使用以下内容进行了一些调试(LHS,所以我猜测与规则相同)

        function boolean say(Object s) { 
              Debug.log("Say %s\n", s); 
              return true; 
        }
        

        查询刚刚做了eval(say($object)) 来帮助我查看它是否被调用过。我正在运行大约一周前的 6.1 快照。也许尝试让它工作(做任何事情)只是从那里获取 Object 并工作 - 它可能是 Number 或 Integer 是你最终在争论而不是 int 的地方?

        【讨论】:

          猜你喜欢
          • 2011-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多