【发布时间】:2021-01-17 16:22:53
【问题描述】:
我有一个类Fact,它是一个扩展java.util.HashMap 类。我将此类的对象作为事实传递给流口水。
现在一个事实实例看起来像这样 (Map
{
"key1": "value"
"attributes": [{"name": "name1", "value": "value1"},{"name": "name2", "value": "value2"},{"name": "name3", "value": "value3"}...]
"locks": [{"type": "type1", "value": "value1", "attributes": {"key_a1": "val_a1""key_a2": "val_a2"...}}]
}
在此映射中的根级别条目上运行验证是直截了当的,例如在 key1 上运行验证。
现在,我想在attributes 和locks 上运行一些验证。
对于属性,我想确保此地图中存在所有需要的属性,并且它们的对应值是正确的。所以我在 when 块中这样做:
fact: Fact(this["key1"] != null && this.containsKey("attributes"));
attributesEntries: Entry(key == "attributes") from fact.entrySet();
attributesMaps: LinkedHashMap() from attributesEntries;
事实是HashMap
属性的类型为 ArrayList<LinkedHashMap<String, String>>(还为 LinkedHashMap 添加了一个 id 键,其值仅是键名的值)。
锁的类型为ArrayList<LinkedHashMap<String, Object>>
锁具有 Map
但它不起作用。当我评估 attributesEntries 它是 ArrayList<LinkedHashMap> 并且它具有所有预期值但 attributesMaps 是空的。我也尝试过传递像LinkedHashMap(key == 'key1', value == 'val1') 这样的过滤器,但这也没有用。尝试寻找解决方案,但没有一种可用于这种结构。无论有什么可用的,我都试图扩展,但没有奏效。
这有可能实现吗?如果可以,如何实现?此外,一旦我能够从Map 获取值,我如何验证值(非空且匹配模式)。
我是 drools 的新手,我们正在使用 5.4.0.Final 版本的 drools。
另外,我如何处理嵌套在Map 中的下一级locks。
【问题讨论】:
-
为什么不迭代根列表中的项目并将值添加到工作内存中?这样,您可以创建另一个规则来匹配孩子并避免使用所有 from。调试起来应该更简单
标签: java spring-boot drools