我有一条规则,由于某种原因没有执行,尽管逻辑上它应该执行:
rule "Getting a List from a declared variable"
when
$object_with_var = Foo()
$class_var: List() from $object_with_var.getListVar()
then
print("Rule fired!")
end
以及我插入 KieSession 的对象:
class Foo() {
@Getter
List() listVar;
public void addToListVar(Object something) {
if (this.listVar == null) {
this.listVar = new ArrayList<>();
}
this.listVar.add(something);
}
}
当我执行规则时,我确保实例化 Foo 并将正确的信息添加到列表中,使其不为空也不为空。然后 Foo 对象被添加到 KieSession。当我在规则中只匹配 Foo 时:
...
when
$object_with_var = Foo()
then
...
规则确实执行。但由于某种原因,简单地获取/声明 List 变量似乎会出现问题:
...
when
$object_with_var = Foo()
$class_var: List() from $object_with_var.getListVar()
then
...
我尝试将类型更改为Arraylist。
我已尝试将我的 Drools eng 更新到最新版本。
有效的方法是:
rule ""
when
Foo(listVar != null , !listVar.isEmpty())
then
...something...
end
但我想了解为什么声明变量不起作用。
我有一条规则,由于某种原因没有执行,即使逻辑上它应该执行:
rule "Getting a List from a declared variable" when $object_with_var = Foo() $class_var: List() from $object_with_var.getListVar() then print("Rule fired!") end
从逻辑上讲,这条规则应该不执行,因为你有语法错误。
要将工作内存中的 Foo 分配给 $object_with_var,请使用冒号而不是等号:
$object_with_var: Foo()
所以你的 LHS 是:
$object_with_var: Foo()
$class_var: List() from $object_with_var.getListVar()
我偶尔会遇到使用
List() from
时出现的问题,编译器会抱怨实例化接口。如果发生这种情况,您可以使用 ArrayList() from
代替。 (有时会发生在 List/ArrayList 和 Map/HashMap 中。永远不知道为什么,但解决方法很简单。)
例如,如果您收到有关实例化接口的错误,这将是解决方法:
$myFoo: Foo()
$myList: ArrayList() from $myFoo.getListVar()