我希望从 drool 的 when 子句中引用 java 类中存在的静态字段。我不想插入代表该值的事实,因为该值与我们的系统相关,而不是与我们的业务逻辑相关。具体来说,它用于记录目的。
下面的链接似乎表明可以从 drl 文件中引用静态变量。显然,这将从 then 子句开始起作用。是否也可以在 when 子句中引用该值?请记住,我不喜欢使用 eval 语句,因为我知道它们是最后的工具。
http://drools.46999.n3.nabble.com/Access-a-static-variable-from-Java-file-to-DRL-File-td4023641.html
更新:
下面是我需要将静态调用放入其中的代码。基本上,只有当日志级别达到一定值时,流口水才会触发。
Java 类:
public class LoggingUtilities{
public static LogLevel logLevel = LogLevel.NONE;
}
drl 文件:
import com.myproject.LoggingUtilities;
rule "MyRule"
when
MyFact()
then
Log.writeOut("Some Stuff");
end
最佳答案
如果您的 Java 类 a.b.Foo
有一个公共(public)静态字段 bar
,您应该
import a.b.Foo;
然后你只需使用
when
SomeFact( ... Foo.bar ... )
在某些约束表达式的上下文中。
如果您遇到问题,请提供该规则的完整 DRL 代码以及该 Java 类的最小代码片段。
稍后
根据您的示例:
import com.myproject.LoggingUtilities;
rule "MyRule"
when
MyFact()
eval( LoggingUtilities.logLevel != LogLevel.NONE )
then
Log.writeOut("Some Stuff");
end
这是条件元素 (!) eval
,它仍然是一等公民。只有“内联”eval
已经不再有用了。
** 稍后 **
您可以通过创建并插入带有日志级别(和其他参数)的事实来避免eval
。这将有额外的优势:
- 您可以动态更改日志级别。
如果规则的唯一目的是记录,您可以尽早阻止规则评估。
Parameters( logLevel != LogLevel.NONE ) MyFact()
关于java - Drools 引用静态场,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24393985/