Drools规则条件 - 检查属性是否为空

时间:2018-01-08 18:45:59

标签: java drools

我有一个相当简单的情况,我想检查我的规则条件是否属性不为空。

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

Fact类只是一个无聊的POJO。它没有Object以外的超类,也没有实现接口。它不是JPA实体或可能存在代理或延迟加载的任何东西。

1 个答案:

答案 0 :(得分:2)

尝试其中一些。我不确定D是否可以用5.3。

rule "only do action if attribute is not null"
when
  Fact($att: attribute != null)             /* A */
  Fact($att: attribute, eval($att != null)) /* B */
  Fact($att: attribute, attribute != null)  /* C */
  Fact($att: attribute, $att != null)       /* D */
then
  rulesLogger.debug("Rule fires = " + $attribute);
end

强烈建议进行升级。 5.5.0可能是一个没有代码中断的选项,但可以避免像这样的失败。