[英]Design guidance needed on implementing rules engine in spring MVC , Hibernate , Oracle project
[英]Need design guidance for implementing Drools rules
我在我的应用程序中使用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异常,因为innerMsg.something.something
为NULL
注意:我不想使用||合并所有空检查。 在单个when语句中,因为我想捕获特定的空条件并基于该条件创建错误消息。
我的问题如下。
我认为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
这与您避免一堆||的愿望背道而驰。 在某种程度上,但这是一种不同的语法。
您无法避免的是使用使代码为空安全的方法。
您可以为访问条件的每个条件加上前缀,每个条件都带有带有null测试的Object子类型:
Fact( field != null && field.subfield == whatsoever )
或使用null安全解引用运算符:
Fact( field!.subfield == whatsoever )
请注意, ==
和!=
隐式为null安全,因此您可以编写
Fact( field == whatever )
如果field == null
则没有问题。
放弃使用激活组和显着性来尽快实现流控制的想法。 这将导致非常糟糕的规则设计,无法维护的代码以及普遍的不愉快感。 如果不能,请全部用Java或其他语言编写。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.