比较drools中的整数会导致强制转换异常

时间:2016-10-07 18:33:58

标签: java integer drools classcastexception

我有一个简单的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。我该如何解决这个错误?

编辑:字符串到int:

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

1 个答案:

答案 0 :(得分:0)

这适合我。

创建会话,默认情况下为所有选项。插入:

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模式。

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

检查您是否已在代码中报告规则,而不是省略异常的实际触发器。