Drools规则如何访问Object类型成员的运行时嵌套属性?
解决Drools中访问Object类型嵌套属性的问题
因为Object类本身没有name()方法,编译期Drools无法识别该属性,所以会报错。以下是几种可行的解决方式:
方法一:将Object强转为Map类型访问
前端传入的JSON数据解析后通常会以Map结构存储(比如Jackson解析后的LinkedHashMap),可以在规则中直接强转并通过键取值:
rule "Check User Name" when Submission($data: data) Map(name == "john") from $data then // 规则执行逻辑 end
或者直接在条件里完成强转和取值:
rule "Check User Name" when Submission($name: ((Map)data).get("name") == "john") then // 规则执行逻辑 end
方法二:在Java类中添加辅助转换方法
在Submission类里新增一个方法,将data转为Map类型,让规则直接调用该方法:
public class Submission { private Object data; // 原有字段、构造器及getter/setter public Map<String, Object> getDataAsMap() { // 假设data是Map结构,直接强转;若为其他JSON对象可做对应转换 return (Map<String, Object>) data; } }
规则中调用该方法即可:
rule "Check User Name" when Submission($name: dataAsMap.get("name") == "john") then // 规则执行逻辑 end
方法三:利用MVEL动态表达式
Drools默认使用MVEL作为表达式语言,支持运行时动态解析属性,可通过eval实现动态访问:
rule "Check User Name" when Submission($data: data) eval($data.name == "john") then // 规则执行逻辑 end
注意:eval会带来一定性能损耗,适合简单场景使用。
额外说明
如果JSON解析后不是Map(比如是Jackson的JsonNode),需要对应调整转换逻辑,比如通过((JsonNode)data).get("name").asText()来获取属性值。尽量在Java层完成数据预处理,让规则逻辑更简洁易维护。
内容的提问来源于stack exchange,提问作者Hashim Siddiqui
相关产品推荐
相关产品推荐

