JBoss Drools技术问题:如何将Java及GUI中的事实传入DRL?
当然得用POJO啊!这是把JavaFX GUI里的用户选择传入Drools DRL的标准且最省心的方式。我结合你说的黑色汽车例子,一步步给你讲清楚整个流程:
1. 先定义对应业务事实的POJO
首先创建一个Car类,用来封装汽车的属性(比如颜色),一定要写标准的getter/setter——Drools得靠这些方法访问对象属性:
public class Car { private String color; // 构造器,方便直接传入颜色初始化 public Car(String color) { this.color = color; } // Getter和Setter是必须的 public String getColor() { return color; } public void setColor(String color) { this.color = color; } }
2. 在JavaFX里收集用户输入并实例化POJO
假设你的界面有个颜色选择下拉框,用户选了“黑色”后点击提交按钮,这时候就可以把用户的选择转换成Car对象,再传给Drools:
// 假设这是JavaFX提交按钮的点击事件处理器 submitBtn.setOnAction(e -> { // 获取用户从下拉框选的颜色 String selectedColor = colorSelectBox.getValue(); // 实例化Car对象,这里用户选的是黑色,所以selectedColor就是"黑色" Car userCar = new Car(selectedColor); // 这里假设你已经初始化好了Drools的KieContainer KieSession kieSession = kieContainer.newKieSession(); // 关键步骤:把Car对象作为「事实」插入到规则引擎中 kieSession.insert(userCar); // 触发所有匹配的规则 kieSession.fireAllRules(); // 用完记得关闭会话释放资源 kieSession.dispose(); });
3. 在DRL规则里直接引用这个事实
现在你就能在DRL文件里写规则匹配这个Car事实了,比如写一个检测黑色汽车的规则:
rule "Handle Black Car Selection" when // 匹配颜色为"黑色"的Car事实,用$car作为变量名方便后续引用 $car: Car(color == "黑色") then // 规则触发后的业务逻辑,比如打印提示或者更新GUI System.out.println("用户选了一辆黑色汽车,执行对应业务逻辑"); // 也可以直接修改事实对象,比如给汽车加个备注 $car.setColor("哑光黑"); end
为什么一定要用POJO?
- Drools规则引擎依赖结构化的Java对象作为事实,POJO是Java里最基础、最易维护的结构化对象,完全符合面向对象设计。
- 标准的getter/setter能让Drools顺利读取和修改对象属性,避免用反射或其他复杂方式带来的坑。
- POJO扩展性极强,后续如果要给汽车加品牌、价格等属性,直接在类里加字段和getter/setter,规则逻辑就能直接复用这些新属性。
内容的提问来源于stack exchange,提问作者Rocky3582
相关产品推荐
相关产品推荐

