Java中Drools规则集失败时如何获取结果及POJO类属性
解决Drools规则校验失败时获取POJO属性及结果的方法
方案1:给业务POJO添加校验状态字段
- 在你的业务POJO里新增
List<String> failedRules、boolean isValid这类字段,专门用来记录失败规则的标识/描述和整体校验状态。 - 编写否定逻辑的规则:当不满足校验条件时,触发规则动作,把对应规则的信息和POJO的关键属性存入这些字段。
示例Drools规则:rule "用户年龄不符合要求" when user: User(age < 18) then user.addFailedRule("用户年龄不符合要求:当前年龄为" + user.getAge()); user.setValid(false); end - 规则执行完成后,直接从POJO中读取
failedRules和属性值,写入Excel即可。
方案2:利用Drools的事件监听机制
- 实现
AgendaEventListener接口,重写matchCancelled、matchCreated、matchFired等方法,跟踪所有规则的匹配和触发状态:matchCreated记录所有可能匹配的规则matchFired记录已经触发的通过规则matchCancelled记录被取消(未触发)的失败规则,同时关联对应的POJO对象
示例Java代码片段:
KieSession kieSession = kieContainer.newKieSession(); kieSession.addEventListener(new AgendaEventListener() { private final Set<String> firedRules = new HashSet<>(); private final List<Map<String, Object>> failedRecords = new ArrayList<>(); @Override public void matchFired(MatchFiredEvent event) { firedRules.add(event.getMatch().getRule().getName()); } @Override public void matchCancelled(MatchCancelledEvent event) { String ruleName = event.getMatch().getRule().getName(); Object fact = event.getMatch().getObjects().iterator().next(); if (fact instanceof User) { User user = (User) fact; Map<String, Object> record = new HashMap<>(); record.put("ruleName", ruleName); record.put("userId", user.getId()); record.put("userAge", user.getAge()); failedRecords.add(record); } } // 规则执行后可通过firedRules和failedRecords获取结果 }); kieSession.insert(user); kieSession.fireAllRules(); - 规则执行完毕后,从监听器收集的
failedRecords中提取失败规则和POJO属性信息,写入Excel。
方案3:设计统一的校验结果收集类
- 创建独立的
ValidationResult类,包含目标POJO对象、通过规则列表、失败规则列表等字段:public class ValidationResult { private Object targetObject; private List<String> passedRules = new ArrayList<>(); private List<String> failedRules = new ArrayList<>(); // getter、setter、add方法省略 } - 将
ValidationResult实例插入到KieSession中,在所有校验规则中引用它,无论是通过还是失败都更新结果:
示例Drools规则:rule "用户年龄校验通过" when user: User(age >= 18) result: ValidationResult() then result.addPassedRule("用户年龄校验通过"); result.setTargetObject(user); end rule "用户年龄校验失败" when user: User(age < 18) result: ValidationResult() then result.addFailedRule("用户年龄校验失败:当前年龄为" + user.getAge()); result.setTargetObject(user); end - 规则执行前先插入
ValidationResult实例,执行后直接从该对象中提取所有校验结果,包括失败情况,再写入Excel。
内容的提问来源于stack exchange,提问作者ashish chauhan
相关产品推荐
相关产品推荐

