You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:53:36