如何解析流口水的字符串(双重比较)



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

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

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

也不起作用。

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

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

最新更新