string - 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;
}
}
也不行。
解决方案
所以这里的问题是我有另一个与给定事实匹配但数量 = null 的对象。然后 Drools 试图将其解析为两倍,当然,这导致了异常。所以解决它的方法是检查金额:
Resource(amount != null, Double.parseDouble(amount) > 0)
推荐阅读
- eclipse - 来自eclipse的spark scala maven构建错误-对象X不是包Y的成员
- macos - Mac w/PostgreSQL 刷新/清空缓存用于性能调整
- python - cmake调用python脚本并验证
- sql - 更改 Power BI 数据集的 SQL 表设计
- sql - Microsoft Access 表显示为空白,但查询正确地从表中提取数据
- azure - .NET Core 2.0 HttpClient Singleton 抛出 502
- android - 禁用滚动视图子,但保持可滚动并启用外观
- git - 我想忽略 .gitignore 中以点 (.) 开头的特定文件
- angularjs - 使用 angular-data-grid 同时过滤两个数据库
- java - Eclipse插件热部署