2012-09-26 36 views
3

最近我正在使用流口水,我想对某些物体进行一些特殊检查。我需要使用规则的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节?

谢谢!

+0

正如答案中所提到的,Drools函数不适用于LHS。但是,我假设你问这是因为你实际上希望在你的LHS中实现代码的重用。为了达到这个目的,你可以使用“extends”关键字。即“规则”规则“扩展”另一个规则“。不幸的是,这个相当有用的功能在Drools文档中没有提及。 – Steve

回答

6

简短的回答是:没有。

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

你可以做什么,是有一个规则,需要所有类型的某一类从工作存储器,适用于然后部分的功能和插入的工作记忆新的价值。

0

我不能确定为什么你得到你所得到的错误,但我使用了一些调试下面昨天在查询(LHS的所以我猜规则一样)

功能boolean say(Object s){Debug.log(“Say%s \ n”,s);返回true; }

查询只是做eval(说($对象))来帮助我看看它是否被调用。我大约在一周前运行6.1的快照。也许尝试让它工作(做任何事情)只是采取对象,并从那里工作 - 它可能是数字或整数是最终在参数而不是int?

3

很可能是一个MVEL或一个集成bug - 函数调用适配器没有box/unbox基本类型。 我看到这个问题已经很老了,但问题已经解决了(使用6.3.0-SNAPSHOT进行测试)。对于旧版本,我会尝试使用盒装类型:函数布尔newFunction(整数a)...

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