drools胁迫使事情失败

时间:2016-06-11 13:16:05

标签: drools

根据文档,"强制总是支持字段类型而不是值类型"

我尝试过但并非总是如此。

规则:

rule "get event field "
when
    m : Message( getEventField("bigDecimalB") > "7.5" )
then
    System.out.println( "hit" );

end

Message类:

public  class Message {

    private Map<String, Object> map = new HashMap<String, Object>();

    public Object getEventField(String key) {
        Object object = map.get(key);
        if (object != null) {
            //class=java.math.BigDecimal in my test
            System.out.println("getEventField, fieldName=" + key + ", class=" + object.getClass().getCanonicalName());
        }
        return object;
}

//setter and getter
}

和测试:

        String str = "{\"bigDecimalB\":10.2}";
        Map<String, Object> map = JSON.parseObject(str);

        Message message = new Message();
        message.setMap(map);
        kSession.insert(message);
        kSession.fireAllRules();

在大多数情况下,它是&#34; bigDecimal比较&#34;显然10.2&gt; 7.5,所以打印&#39;点击&#39;。

但它有时可能会失败而且不会打印出来#。

我认为这是因为强制不是成功的,而且是#34;字符串比较&#34;。很难再现。我完全糊涂了,不知道为什么。

我使用drools-6.2.0-final和阿里巴巴的fastjson(https://github.com/alibaba/fastjson)。

非常感谢。

1 个答案:

答案 0 :(得分:0)

如果你有这样的方法声明:

 public Object getFooField(String key)

你认为一个愚蠢的计算机程序可能会考虑该方法的返回类型?