我正在使用一个系统,其中插入Drools引擎的一些数据遵循这种(过度简化的)格式:
public class Item {
public String getValueType() { ... }
public Object getValue() { ... }
}
值可能是几种不同的类型。现在,我想创建一堆Drools规则来检查值的各个字段,类似于:
$a : Item(valueType == "Car", value.owner.location == "At Home")
$b : Item(valueType == "Payments", value.rates.discounts.percent == 1337)
$c : Item(valueType == "Royalty", value.student.occupation == "Librarian")
......等等。现在,我面临的问题是Drools静态类型检查规则,因为它们被加载,不允许这种用途,因为Object不能保证拥有所有者/ rates / student字段等等。
有没有办法做到这一点,可能是某种类型转换或绕过类型检查?
(注意:不幸的是,现在它不是更改要键入的模型而不是将所有内容推送到对象中的选项。)
答案 0 :(得分:5)
从Drools 5.5.0开始,您可以“投射”事实的属性。请阅读本文件的第4.1.1.2节:http://docs.jboss.org/drools/release/5.5.0.Final/droolsjbpm-introduction-docs/html_single/
基本上,您需要做的是:
$a : Item(valueType == "Car", value#Car.owner.location == "At Home")
免责声明:我之前从未尝试过这个。
答案 1 :(得分:2)
你也可以在类型声明中使用@typesafe(false),但是如另一个答案中所示的转换要好得多。