我有一个非常简单的例子,我想在规则条件中检查属性是否为null。
rule "only do action if attribute is not null"
when
$fact : Fact(attribute!=null, $attribute : attribute)
then
rulesLogger.debug("Rule fires = " + $attribute);
end
我在调试中跟踪了这一点。正在插入一个属性为null的事实,但该规则仍会激发。控制台输出如下。
Rule fires = null
如果我将条件更改为
attribute==null
那么规则就不起作用了。因此,这似乎与我的预期完全相反。
我们确实有一个使用函数的解决方法,但它有点难看,我不明白为什么它首先不起作用。
function Boolean attributeExists(Fact fact)
{
if(fact.getAttribute() == null)
{
return Boolean.FALSE;
}
else
{
return Boolean.TRUE;
}
}
rule "only do action if attribute is not null"
when
$fact : Fact($attribute : attribute)
Boolean(booleanValue == true) from attributeExists($fact)
then
rulesLogger.debug("Rule fires = " + $attribute);
end
编辑1
drools版本为5.3.0。
事实通过另一条规则加载,使用
from
和服务方法调用。我看不出这个事实是无效的,因为它按我所期望的方式打印到控制台上,而且带有函数的手动解决方法也按预期工作。真奇怪。
编辑2
我找到了一个更好的解决办法。如果我使用getter方法访问属性,那么规则的行为与预期的一样。这看起来比必须编写一个额外的函数要好得多,但如果知道为什么在使用属性名称时这不起作用,那就更好了。
rule "only do action if attribute is not null"
when
$fact : Fact(getAttribute()!=null, $attribute : attribute)
then
rulesLogger.debug("Rule fires = " + $attribute);
end
事实课只是一个无聊的POJO。它没有对象以外的超类,也没有实现接口。它不是JPA实体或任何可能存在代理或延迟加载的实体。