0

我在我的应用程序中使用 Drools 6.1.0。

我们计划编写一个包含所有规则的巨大 .drl 文件。

规则主要有2类 1.空检查 2.业务验证

使用规则流组、激活组和显着性,我计划在将事实添加到会话时管理要执行/触发的规则。

即使采用这种方法,该解决方案对我也不起作用,因为。

可以说我有以下 .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 异常,因为innerMsg.something.something它是 NULL

注意:我不想使用 || 合并所有空检查。在单个 when 语句中,因为我想捕获特定的空条件并基于该条件创建错误消息。

我的问题如下。

  1. 使用drools 规则对链接对象进行Nullchecks 是个好主意吗?
  2. 我是否应该使用诸如顺序规则执行之类的其他东西(不确定 Drools 中是否可用),这将允许我按特定顺序执行规则。
  3. 有没有另一种方法来实现这一点
4

2 回答 2

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

这违背了你避免一堆 || 的愿望。在一定程度上,但它是一种不同的语法。

于 2015-05-21T19:12:22.697 回答
0

您无法避免的是使用使您的代码为空安全的。

您可以为每个条件添加前缀,通过空测试访问具有 Object 子类型的字段:

Fact( field != null && field.subfield == whatsoever )

或者您使用 null-safe 取消引用运算符:

Fact( field!.subfield == whatsoever )

请注意,==and!=是隐式空安全的,因此您可以编写

Fact( field == whatever )

如果没有问题field == null

放弃使用激活组和显着性来尽快实现流量控制的想法。这将导致非常糟糕的规则设计、无法维护的代码和普遍的不满。如果不能,请用 Java 或其他语言编写。

于 2015-05-22T04:15:36.350 回答