Drools规则THEN块如何返回专属自定义对象作为响应(无直接kieSession权限)
Drools Workbench 规则THEN块插入自定义返回对象实现方案
实现步骤
第一步:在Drools Workbench对应项目中创建专属自定义返回数据对象
你可以新建一个例如名为ValidationResult的自定义类,添加你需要的返回字段,示例定义如下:import java.io.Serializable; public class ValidationResult implements Serializable { private String resultMessage; private Boolean isValid; // 可选字段:关联原请求标识,方便匹配请求和对应的返回结果 private String requestId; // 请自行补充无参构造方法、所有字段的getter/setter方法 }注意必须给对象实现Serializable接口、补充无参构造和字段的get/set方法,避免Workbench执行规则时出现序列化异常。
第二步:修改规则文件,在THEN块插入自定义返回对象
不需要修改原有WHEN块的匹配逻辑,仅需要在THEN块中实例化自定义对象,调用Drools内置的insert()方法将对象插入工作内存即可,全程不需要手动操作KieSession。修改后的规则示例如下:rule "validate Date" salience 100 when $req : LiabilityRequestDto(expireAt before issueAt || issueAt before getNow()) then // 实例化自定义返回对象 ValidationResult result = new ValidationResult(); result.setIsValid(false); result.setResultMessage("\n invalid date"); // 可选:绑定原请求标识,方便后续匹配对应请求的返回结果 result.setRequestId($req.getRequestId()); // 调用Drools内置方法将对象插入工作内存 insert(result); end第三步:在Workbench中配置结果查询逻辑获取返回对象
因为无法直接访问KieSession,你可以在Workbench项目中新建查询(Query),用于提取工作内存中的自定义返回对象,示例查询代码如下:query "getValidationResult" $result : ValidationResult() end规则执行完成后,直接调用该查询即可拿到所有规则生成的自定义返回对象。
额外说明
- 如果需要多规则共同修改同一返回对象,可以在WHEN块先匹配是否已经存在对应请求的
ValidationResult,匹配到就直接修改该对象,没有匹配到再新建插入,避免生成多个冗余结果 - 如果校验不通过需要阻止后续规则执行,可以在插入返回对象后调用
drools.halt()方法终止规则流
内容的提问来源于stack exchange,提问作者Soheil Babadi
相关产品推荐
相关产品推荐

