Drools 从声明的变量中获取 List() 对象问题

问题描述 投票:0回答:1

我有一条规则,由于某种原因没有执行,尽管逻辑上它应该执行:

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

但我想了解为什么声明变量不起作用。

drools
1个回答
0
投票

我有一条规则,由于某种原因没有执行,即使逻辑上它应该执行:

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()
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.