有没有办法在流口水中调用void函数?

如何解决有没有办法在流口水中调用void函数?

有没有一种方法可以将void函数作为when条件的一部分? 我正在尝试拥有自己的功能,该功能必须将某些业务逻辑作为每个规则的一部分来调用

例如:自定义日志功能,此功能是静态的。

rule "some rule"
    when
        $instance : Customer(type == "Regular");
        eval(Utils.log());
    then
        ......
end

当我执行上述操作时,该函数调用,但执行失败并显示

java.lang.RuntimeException: Utils.log() : java.lang.NullPointerException

    at org.drools.core.rule.EvalCondition.isAllowed(EvalCondition.java:129)
    at org.drools.core.phreak.PhreakEvalNode.doLeftInserts(PhreakEvalNode.java:72)
    at org.drools.core.phreak.PhreakEvalNode.doNode(PhreakEvalNode.java:56)
    at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:389)

有人可以帮助我了解何时可以调用函数吗?

解决方法

您可以从右侧调用void函数。您不能从左侧开始,因为这没有任何意义。应当认为左侧是条件-虚空不是条件。

rule "some rule"
when
  Customer(type == "Regular")
then
  Utils.log()
end

读为:“如果有一个客户输入'Regular'类型,则调用log()函数。“

从逻辑上讲,您无法从“何时”执行此操作。那甚至意味着什么? “当有一个类型为'Regular'且...无效的客户时?”


如果您坚持要这样做,请将日志记录函数的返回类型更改为return true,这样它将始终具有匹配的条件。 请勿不要依靠此日志记录调用的结果来尝试跟踪执行时间或执行规则-只会告诉您Drools引擎在确定规则匹配时评估了该行。如果后续条件导致该匹配项被丢弃,则该日志记录将已经触发。条件子句中的方法应该是纯净的,没有副作用。

public static boolean log() {
  // logic
  return true;
}

rule "an awful rule don't do this"
when
  Customer(type == "Regular")
  Boolean (this == true) from Utils.log()
then
  // logic
end

rule "another awful rule,still don't do this"
when
  Customer( type == "Regular" )
  eval( Utils.log() )
then
  // logic
end

我绝对建议永远这样做。


如果您只是想记录规则的匹配情况,则应该使用listener来实现记录逻辑,而不是污染规则。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?