当一个人在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(金额):空]
[附近:{... Double.parseDouble(amount)> 0 ....}]
-------------- ^
有趣的是,当您将其与字符串进行比较(金额==“ 10”)时,它可以正常工作。但是,当您尝试将“金额”解析为Double时,Java根本不知道有任何值(认为数量== null,因此无法解析它)。
第二件有趣的事情是,如果您在Java中创建了该对象(资源),并将其插入到“ fireAllRules()”之前,则“解析器”可以看到“ amount”字段,并且它可以工作。
但是问题在于,我无法在触发规则之前创建该对象,因为我不知道会不会需要它。我的字段也必须是String。而且我必须像“大于”或“小于”进行比较,因此比较字符串不适用。
我试图在规则之前创建一个函数,例如:
function boolean isValid(String s){
try {
Double.valueOf(s);
return true;
} catch(Exception e){
return false;
}
}
也不起作用。
答案 0 :(得分:0)
所以这里的问题是我有另一个对象,该对象与给定的事实匹配,但数量为null。然后Drools试图将其解析为两倍,这当然导致了异常。因此解决该问题的方法是检查金额:
Resource(amount != null, Double.parseDouble(amount) > 0)