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