升级Drools项目时CSV决策表出现ObjectType解析失败问题
升级Drools项目时CSV决策表出现ObjectType解析失败问题
看起来你在把老版本Drools升级到9.44后,用CSV决策表跑规则时踩了类解析失败的坑,我来帮你一步步理清楚问题和解决办法:
核心问题拆解
从你贴的错误日志就能看出来,Drools在编译CSV转换后的规则时,完全找不到你用到的业务类(PoolInfo、PostponementRequest)和JDK集合类(LinkedList)的定义:
ERROR Unable to build KieBaseModel:defaultKieBase Unable to resolve ObjectType 'PoolInfo' : [Rule name='postponePart_14'] Unable to resolve ObjectType 'LinkedList' : [Rule name='postponePart_14']
本质原因无非两个:要么CSV规则本身没正确导入这些类,要么Drools的构建流程用的类加载器碰不到你的业务类字节码。
具体解决步骤
1. 先把CSV规则的类导入补全
CSV决策表最终会被转换成DRL文件执行,所以必须在文件开头显式导入所有规则用到的类,包括JDK类。打开你的postponementRules.drl.csv,在最顶部添加DRL风格的导入语句:
package postponementRules; // 替换成你实际的业务类包路径 import com.yourcompany.model.PoolInfo; import com.yourcompany.model.PostponementRequest; import java.util.LinkedList; // 下面开始你的规则内容
另外,处理下警告里的包与文件夹不匹配问题:要么把CSV文件移到postponementRules文件夹下(和声明的package名保持一致),要么把CSV里的package改成rules,避免潜在的类路径混淆。
2. 给Drools指定能访问业务类的类加载器
你当前的getKieContainer方法用的是Drools默认的类加载器,它可能访问不到你的业务类。修改方法,显式传入能加载PoolInfo这类类的类加载器(也就是你当前类的类加载器):
public KieContainer getKieContainer(final String decisionTableFilename){ KieServices kieServices = KieServices.Factory.get(); Resource resource = ResourceFactory.newClassPathResource(decisionTableFilename, getClass()); KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(resource); // 显式指定类加载器,确保Drools能找到你的业务类 KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem) .setClassLoader(getClass().getClassLoader()); kieBuilder.buildAll(); KieRepository kieRepository = kieServices.getRepository(); ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId(); // 创建KieContainer时也传入同一个类加载器 KieContainer kieContainer = kieServices.newKieContainer(krDefaultReleaseId, getClass().getClassLoader()); return kieContainer; }
3. 检查规则里的对象类型写法
最后确认CSV规则中引用对象的地方,要么用全限定类名(比如com.yourcompany.model.PoolInfo),要么确保已经通过import语句导入了类名,而且大小写要完全匹配(Drools对类名大小写敏感)。
额外验证点
- 确认Maven/Gradle依赖里已经正确引入了Drools决策表的必要依赖:
<!-- Maven示例,版本和你的Drools 9.44保持一致 --> <dependency> <groupId>org.drools</groupId> <artifactId>drools-decisiontables</artifactId> <version>9.44.0.Final</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-ci</artifactId> <version>9.44.0.Final</version> </dependency> - 测试代码里的业务对象(比如
poolInfo、postponementRequest)要确保初始化正确,避免因对象为null导致的间接问题。
按照上面的步骤调整后,应该就能解决类解析失败的问题,让CSV规则正常跑起来了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

