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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:24:31