Java 实施Drools规则需要设计指导

Java 实施Drools规则需要设计指导,java,drools,validationrules,Java,Drools,Validationrules,我在应用程序中使用Drools 6.1.0 我们计划编写一个巨大的.drl文件,其中包含所有规则 规则主要分为两类 1.空检查 2.业务验证 使用ruleflow组、activation组和salience,我计划管理在将事实添加到会话时执行/触发哪些规则 即使采用这种方法,解决方案对我也不起作用,因为 假设我有下面的.drl文件 rule "rule1" ruleflow-group "primary" activation-group "NullCheck" salience 5 when

我在应用程序中使用Drools 6.1.0

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

规则主要分为两类 1.空检查 2.业务验证

使用ruleflow组、activation组和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异常,因为
innerMsg.something.something.something
为NULL

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

我的问题如下

  • 使用drools规则对链接对象执行空检查是否是一个好主意
  • 我是否应该使用其他类似于顺序规则执行(不确定Drools中是否提供)的方法,这将允许我按特定顺序执行规则
  • 有没有其他方法可以做到这一点
  • 我想可能和你看到的有关。你可以试试下面的方法

    规则“规则2”
    规则流组“主”
    激活组“空检查”
    显著性4
    什么时候
    $m:消息(innerMsg!=null)
    消息(this==m,innerMsg.something!=null)
    消息(this==m,innerMsg.something.something==null)
    然后
    


    在某种程度上,这与您避免大量| |的愿望背道而驰,但这是一种不同的语法。

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

    您可以在访问字段的每个条件前面加上带有空测试的对象子类型的前缀:

    Fact( field != null && field.subfield == whatsoever )
    
    或者使用空安全解引用运算符:

    Fact( field!.subfield == whatsoever )
    
    请注意
    ==
    =是隐式空安全的,因此您可以编写

    Fact( field == whatever )
    
    如果
    字段==null
    ,则没有问题


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

    完全没有理由不将所有内容放在一个模式中,使用
    &&
    组合所有约束。我对这个问题的回答已经过时了,因为同时在Drools中添加了空安全性。因此,是否建议不要使用议程组/运行流组等?在某些情况下,会显示议程组和显著性,但我认为在您的应用程序中找不到它们。