代码之家  ›  专栏  ›  技术社区  ›  Ben Thurley

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

  •  5
  • Ben Thurley  · 技术社区  · 7 年前

    我有一个非常简单的例子,我想在规则条件中检查属性是否为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实体或任何可能存在代理或延迟加载的实体。

    1 回复  |  直到 7 年前
        1
  •  2
  •   laune    7 年前

    试试这些。我不确定5.3是否有可能实现D。

    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可能是一个没有代码中断的选项,但可以避免像这样的故障。