我在我的应用程序中使用Drools 6.1.0。
我们计划编写一个包含所有规则的巨大.drl文件。
主要有两类规则 1.空检查 2.业务验证
使用ruleflow-group,activation-group和salience我计划在事件添加到会话时管理要执行/触发的规则。
即使采用这种方法,解决方案也不适合我,因为。
假设我有以下.drl文件
rule "rule1"
ruleflow-group "primary"
activation-group "NullCheck"
salience 5
when
$m : Message(innerMsg.something == null)
then
// do something
rule "rule2"
ruleflow-group "primary"
activation-group "NullCheck"
salience 4
when
$m : Message(innerMsg.something.something == null)
then
// do something
rule "rule3"
ruleflow-group "primary"
activation-group "NullCheck"
salience 3
when
$m : Message(innerMsg.something.something.something == null)
then
// do something
Drools文档说明了这个"插入事实时会评估所有约束。来自Drools手册:条件评估不依赖于特定的评估顺序或时间点,而是在发动机的使用寿命期间的任何时间连续发生。"
所以发生的事情是执行此文件的代码在rule2上抛出Nullpointer Exception,因为innerMsg.something.something
为NULL
注意:我不想使用||进行所有空检查在单个when语句中,因为我想捕获特定的null条件并基于此创建错误消息。
我的问题如下。
答案 0 :(得分:0)
我认为http://drools-moved.46999.n3.nabble.com/rules-users-Drools-Activation-Group-td3546598.html可能与您所看到的相关。您可以尝试以下内容。
rule "rule2"
ruleflow-group "primary"
activation-group "NullCheck"
salience 4
when
$m : Message(innerMsg != null)
Message(this == $m, innerMsg.something != null)
Message(this == $m, innerMsg.something.something == null)
then
这违背了你避免一堆||的愿望在某种程度上,但它是一种不同的语法。
答案 1 :(得分:0)
您无法避免的是使用您的代码为空安全。
要么为访问具有子类型Object且具有空测试的字段的每个条件添加前缀:
Fact( field != null && field.subfield == whatsoever )
或者您使用null-safe解除引用运算符:
Fact( field!.subfield == whatsoever )
请注意,==
和!=
隐式为空安全,因此您可以编写
Fact( field == whatever )
如果field == null
没有问题。
放弃使用激活组和显着性的想法尽可能快地实现流量控制。这将导致一个非常糟糕的规则设计,不可维护的代码和一般的不快乐。如果你不能,用Java或其他语言写出来。