当前位置: 首页 > 知识库问答 >
问题:

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

应翰飞
2023-03-14

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

rule "only do action if attribute is not null"
when
    $fact : Fact(attribute!=null, $attribute : attribute)
then
    rulesLogger.debug("Rule fires = " + $attribute);
end

我在调试中跟踪了这一点。正在插入一个Fact,属性为null,但规则仍然会触发。控制台输出如下。

Rule fires = null

如果我将条件更改为属性==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

口水版本是5.3.0。

事实是通过另一条规则加载的,该规则使用来自的和服务方法调用。我看不出这个事实是无效的,因为它按我所期望的方式打印到控制台上,而且带有函数的手动解决方法也按预期工作。真奇怪。

编辑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个答案

全卜霸
2023-03-14

试试这些。我不确定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可能是一个没有代码中断但避免此类故障的选项。

 类似资料:
  • 我的问题是: 在Drools规则中,有没有一种方法可以拦截“成功”事件?为了更好地解释。。。有一种方法可以在规则的所有条件都为真时调用侦听器? 注意:我不想设置一个全局对象(在会话上)来管理规则的“然后”子句中的这个条件。 我正在寻找一个已经在Drools上实现的解决方案 规则示例

  • 任何关于这个或者如何使用drools api修改drools规则的想法都将是有用的。 注意:我不想为修改规则做字符串替换。

  • 我创建了一个规则,其“when”条件如下:- 上述条件运行良好。现在我如何在一个规则中添加多个布尔条件?为(如)。上面的规则可以概括为:a和b,所以如果我想创建一个规则:(a和b)或c,那么它的实际drl语法是什么。我对drools是新手,所以请帮助我了解规则(a和b)或C的语法。 我确实创建了一个语法 错误消息:Message[id=1,level=Error,path=mapiteration

  • 我是Drools Fusion的新手,我想知道为什么我的规则不总是被取消。我用的是Drools 6.3。以下是我要插入的事件: 这是我的规则文件: 这是我的输出: 我预计我的规则将触发2次,并给出以下输出: 我可能忽略了一些事情,但我没有找到关于我的问题的太多信息。有人能解释一下这里到底发生了什么吗?非常感谢。

  • 口水5,方言mvel 我希望此规则仅在存在任何MappingFile对象时匹配,并且仅当带有原因码的BLuReport对象为NULL时匹配 我怎样才能写出那个比较表达式。。。我尝试了几件事都没有成功: 此外,我不得不添加retract(BR),因为更新后我一直得到一个无限循环。。。我的更新正确吗?!

  • 我有一个关于如何评估Drools决策表的条件的问题。我原以为条件是从左到右计算的,如果它检查给定规则的最左边的列为false,它将不会检查其余的条件。 这对我来说很重要的一个原因是将范围最窄的条件放在最左边的概念。这意味着对象会更快地启动,而不是大多数满足广泛条件的对象首先并继续检查附加条件。 然而,这不是我在单元测试中看到的行为,我将在下面概述。 这个例子很简单,并不是为了演示范围的早期缩小。