Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 流口水功能_Java_Function_Drools - Fatal编程技术网

Java 流口水功能

Java 流口水功能,java,function,drools,Java,Function,Drools,最近我正在研究drools,我想对一些对象进行一些特殊检查。我需要在规则的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.pr

最近我正在研究drools,我想对一些对象进行一些特殊检查。我需要在规则的
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
部分中的函数是否不支持drools


谢谢

简单的回答是:不

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

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

编辑
这个答案最初发布于2012年,与此无关,因为较新版本的drools确实支持
when
子句上的函数。

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


查询只是执行了
eval(比如($object))
来帮助我查看它是否被调用过。我正在运行大约一周前的6.1快照。也许试着让它工作(做任何事情)只是从那里获取对象和工作-可能是Number或Integer,而不是int?很可能是MVEL或集成错误-函数调用适配器没有装箱/取消装箱原语类型。
我知道这个问题已经很老了,但是问题已经解决了(使用6.3.0-SNAPSHOT进行了测试)。对于旧版本,我会尝试使用装箱类型:function boolean newFunction(Integer a).

按照上面选择的答案,经过一些实验,我发现可以创建一个外部java方法,该方法的类可以导入到规则文件中,并封装在MVEL函数包装器(boolean)中然后可以从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

如回答中所述,Drools功能不适用于LHS。但是,我假设您这样问是因为您实际上希望在LHS中实现代码的重用。要实现这一点,可以使用“extends”关键字。i、 e.
规则“一条规则”扩展了“另一条规则”
。不幸的是,Drools文档中没有提到这一相当有用的功能。
[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