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

如何从Drools程序化规则自动生成含Then子句参数的文档?

问题描述

我正在参与一个使用Drools验证Java对象的项目,目前已有大量规则,其中部分源自决策表,其余则不是,这导致难以梳理特定对象适用的规则。我尝试通过程序化方式从.drl规则生成文档,已成功通过以下代码从LHS(When子句)提取信息:

RuleImpl rule = KieContainer.getKieBase().getKiePackages().get(index).rules.get(ruleIndex)
GroupElement whenGroup = rule.getLhs()

但Drools API似乎无法提供Then子句的详细信息,通过rule.consecuence仅能获取创建对象的类,无法获取参数。例如在以下Then子句中:

then
        insert(new Valideringsfejl("rta014.5", FejltypeHelper.MAA_IKKE_ANGIVES, "planlagtKapacitetIkkeAngivetSol"));

我需要获取"rta014.5", FejltypeHelper.MAA_IKKE_ANGIVES和"planlagtKapacitetIkkeAngivetSol"这些参数。请问是否有无需自行解析源码的获取方式,或其他文档生成方案?

解决方案

1. 自定义规则元数据嵌入

Drools原生没有暴露RHS结构化参数的API,但可以通过给规则添加自定义注解提前标记关键参数,后续直接读取:

  • 手写DRL规则时,新增自定义注解存储参数:
    rule "PlanlagtKapacitetValidering"
      @RuleMeta(errorCode = "rta014.5", errorType = "MAA_IKKE_ANGIVES", msgKey = "planlagtKapacitetIkkeAngivetSol")
      when
        // LHS条件
      then
        insert(new Valideringsfejl("rta014.5", FejltypeHelper.MAA_IKKE_ANGIVES, "planlagtKapacitetIkkeAngivetSol"));
    end
    
    通过rule.getAnnotations()即可直接提取这些元数据,无需解析RHS代码。
  • 决策表生成的规则,在表中新增列存储参数元数据,生成DRL时自动带上注解,统一提取即可。

2. 调试事件拦截获取实际参数

通过监听规则触发事件,在执行时提取插入对象的参数:

KieSession kieSession = kieContainer.newKieSession();
kieSession.addEventListener(new DefaultAgendaEventListener() {
    @Override
    public void afterActivationFired(AfterActivationFiredEvent event) {
        Rule rule = event.getActivation().getRule();
        // 筛选规则插入的目标对象
        Collection<Valideringsfejl> errors = kieSession.getObjects(o -> o instanceof Valideringsfejl);
        for (Valideringsfejl err : errors) {
            // 提取err的code、type、msgKey等参数并关联当前规则
        }
    }
});
// 插入测试对象触发规则
kieSession.insert(testObject);
kieSession.fireAllRules();

这种方式需要模拟规则执行,但能拿到实际运行时的参数值,适合需要验证参数正确性的场景。

3. 基于Drools解析器的静态提取

利用Drools自带的DrlParser解析DRL文本生成抽象语法树(AST),遍历树结构提取RHS中的方法参数:

DrlParser parser = new DrlParser();
DrlParser.RuleContext ruleContext = parser.parseRule(drlRuleText);
// 参考Drools的drl.g4语法定义,定位RHS中的insert语句节点,提取参数

无需修改现有规则,但需要熟悉DRL的语法结构,实现复杂度略高。

4. 简化的文档生成替代方案

如果核心需求是梳理规则与对象的关联,而非精确提取参数:

  • 给每个规则添加清晰的注释,包含适用对象、触发条件、执行动作,用正则批量提取注释生成文档;
  • 遍历KieBase中的所有规则,结合LHS的GroupElement分析匹配的对象类型,搭配规则名称、注释生成规则清单。

内容的提问来源于stack exchange,提问作者Zorobay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:26:29