需要设计指南来实施Drools规则

时间:2015-05-21 17:54:59

标签: java drools validationrules

我在我的应用程序中使用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条件并基于此创建错误消息。

我的问题如下。

  1. 使用drools规则对链接对象执行Nullchecks是一个好主意。
  2. 我应该使用其他类似顺序规则执行的东西(不确定Drools是否可用),这样我就可以按特定顺序执行规则。
  3. 有没有其他方法可以实现这个目标

2 个答案:

答案 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或其他语言写出来。