如何从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")); endrule.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
相关产品推荐
相关产品推荐

