首页 > 解决方案 > Drools 中如何解析字符串(双重比较)

问题描述

当一个人在 drl 文件中插入一个新对象,然后想要将它的字符串表示形式与下一个规则中的另一个数字进行比较时,Drools 给出了一个例外。举个例子就清楚多了。

rule "rule_1"
dialect "mvel"
salience -10

when

then
    Resource resource = new Resource();
    resource.setAmount("10"); //note - this accepts only Strings
    insert(resource);
end

rule "rule_2"
dialect "mvel"
salience -20

when
    $resource: Resource(Double.parseDouble(amount) > 0.0) //exception
    //$resource: Resource(amount == "10") - no error here
then
    System.out.println("$resource.value = " + $resource.amount);
end

例外是: 引起:[错误:Double.parseDouble(amount): null]
[Near : {... Double.parseDouble(amount) > 0 ....}]
----------- ---^
有趣的是,当您将其作为字符串(数量 == “10”)进行比较时 - 它工作正常。但是,当您尝试将“数量”解析为 Double 时,Java 根本不知道有任何值(认为数量 == null,因此无法解析它)。第二个有趣的事情是,如果您在 java 中创建了这个对象(资源)并将其插入到“fireAllRules()”之前 - “amount”字段对解析器可见并且它可以工作。
但问题是我不能在触发规则之前创建这个对象,因为我不知道是否需要它。我的字段也必须是字符串。而且我必须像“大于”或“小于”一样比较它,所以比较字符串不适用。
我试图在规则之前创建一个函数,例如:

function boolean isValid(String s){
    try {
        Double.valueOf(s);
        return true;
    } catch(Exception e){
        return false;
    }
}

也不行。

标签: stringparsingdoubledrools

解决方案


所以这里的问题是我有另一个与给定事实匹配但数量 = null 的对象。然后 Drools 试图将其解析为两倍,当然,这导致了异常。所以解决它的方法是检查金额:

Resource(amount != null, Double.parseDouble(amount) > 0)

推荐阅读