我有一个 XML 文件,其中包含元数据,例如字段的最大长度。我必须使用 drools 来构建规则,以根据事实列表验证此元数据。我不想对可能在 XML 中指定或不指定的每个字段的名称进行硬编码。
我试着这样做:
when
$metadata: Metadata(maxLength != null);
$obj: Object(eval($metadata.getFieldName()).length > $metadata.maxLength);
then
// TODO
end
它不起作用,我收到以下错误:
java.lang.IllegalStateException: Errors while building rules : Unable
to Analyse Expression $metadata.getFieldName() > $metadata.maxLength:
[Error: Comparison operation requires compatible types. Found class
java.lang.String and class java.lang.Integer] [Near : {...
$metadata.getFieldName() > $metadata.maxLength ....}]
是否可以动态获取字段名并比较其最大长度?我是否必须创建一个 java 对象才能完成此操作?
谢谢
最佳答案
您谈到了 XML 和元数据。你能区分所有实体吗?比如订单,能不能提取出每个订单,以及每个订单的属性?
我通过使用 map 来存储每个属性解决了类似的问题。
public class Order{
private int id;
private Map<String, Integer> num_attribute_map = new HashMap<String, Integer>();
public Map getNumAttributeMap(){
return this.num_attribute_map;
}
如果订单的customer_satisfaction
= 5,
order_obj.getNumAttributeMap().put("customer_satisfaction" , 5);
因此您创建了 Order
,它们的属性存储在 numAttributeMap
中。
用于在 Order
上实现规则
$ord : Order(
getNumAttributeMap[$attribute] >= $value
)
当然,$attribute
就是 "customer_satisfaction"
。 []
符号用于访问列表的元素,给定索引或映射的值,给定键。
希望您“了解” map 的概念。此外,请查看 Drools 语言对列表和 map 访问的支持。
除了执行比较操作的整数映射之外,我还实现了字符串列表映射以执行“在”操作。请引用https://stackoverflow.com/a/9241089/604511也是
关于java - 我怎样才能在 drools 中获得动态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777139/