比较流口水中的整数会导致强制转换异常

Comparing integers in drools causes cast exception

我有一个简单的 Drools 规则,我将一个字符串转换为一个整数,然后将它与另一个整数进行比较。像这样:

when
    $list : List(size > 0 )
    $m1 : Map() from $list.get(0)
    $var1 : Map(stringToInt(this["number"]) <= 0) from $list.get(0)

这应该检查我的地图中"number"的字符串值在转换后是否小于或等于0。 stringToInt 只是我编写的一个辅助函数,它调用 Integer.parseInt 并捕获异常。

我在尝试 运行 规则时遇到此错误:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
    at org.mvel2.ast.Negation.getReducedValueAccelerated(Negation.java:48)

方言设置为java,我的drools版本是6.4.0。我该如何解决这个错误?

编辑:字符串到整数:

public static int stringToInt(String s) {
    try {
        int num = Integer.parseInt(s);
        return num;
    } catch (Exception e) {
        return -1;
    }
}

这对我有用。

正在创建会话,所有选项默认。插入:

Map<String,String> map = new HashMap<>();
map.put( "number", "4711" );
List<Map<String,String>> list = new ArrayList<>();
list.add( map );
kieSession.insert( list );

运行 一个 drl:

import static map.Main.stringToInt;
import java.util.*;
rule "int from map"
when
  $list : List(size > 0 ) 
  $m1 : Map() from $list.get(0)
  $var1 : Map(stringToInt(this["number"]) > 0 ) from $list.get(0)
then
  System.out.println( "got 4711" );
end

我什至保留了多余的第一个(空)Map 模式。

检查您的 class 路径是否包含 mvel2-2.2.8.Final.jar 而没有其他版本。 (这是 class Negation 所在的位置。)

检查您是否报告了规则,因为它在您的代码中,没有遗漏异常的真正触发器。