8

最近我正在使用流口水,我想对某些对象进行一些特殊检查。我需要使用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)

节中的功能不支持流口水when吗?

谢谢!

4

4 回答 4

11

最简洁的答案是不。

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

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

编辑

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

于 2012-09-26T15:44:49.257 回答
3

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

于 2014-12-23T17:22:28.230 回答
2

按照上面选择的答案,经过一些实验,我发现可以创建一个外部 java 方法,其类可以导入规则文件,并包装在一个 MVEL 函数包装器(布尔值)中,然后可以从 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
于 2015-02-03T19:40:23.917 回答
0

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

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

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

于 2014-07-21T13:20:42.467 回答