java - 我怎样才能在 drools 中获得动态属性

标签 java drools

我有一个 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/

相关文章:

java - Drools:字符串全局变量的奇怪行为

java - 使用 Drools 执行响应式规则

compiler-errors - 使用JDK 1.8时出现Drools 6.50错误

java - drl 文件的 MIME 类型

java.lang.NoClassDefFoundError : com. 谷歌.common.base.CharMatcher

java - 内部方法调用方面

java - Windows 服务器上的 Tomcat 问题

java - MouseListener 类从未被调用?

java - Drools acquire() 的空指针异常

java - 如何减少类路径中的资源加载时间?