Java集成测试调用Drools规则时报空指针异常该如何解决
问题排查及修复方案
1. 测试类未加载Spring上下文导致空指针
你抛出空指针的核心原因是JUnit测试类没有加Spring测试相关注解,@Autowired注入的GrievanceRuleService、KieContainer全为null,调用方法时自然触发NPE。
修复方式:在测试类上添加注解,加载你写的配置类:
@SpringBootTest // 非SpringBoot项目可替换为: // @RunWith(SpringRunner.class) // @ContextConfiguration(classes = RuleConfiguration.class) public class RuleTest { // 原有测试代码不变 }
2. KieContainer配置的规则文件路径错误
你配置的规则文件路径/src/main/resources/drools/GrievanceRules.drl不符合类路径加载规则:src/main/resources目录下的内容编译后会直接放在类路径根目录,不需要前缀。
修复方式:修改路径配置:
public static final String grivFile = "drools/GrievanceRules.drl";
3. DRL规则语法不规范,可能触发规则匹配失败
Drools规则LHS(条件部分)无需手动调用get方法,直接写属性名即可,且你的写法如果category为null会额外触发空指针,建议调整规则条件写法:
rule "grievancesMap_10" when $grievances:GrievanceDTO("NA".equals(category)) then $grievances.setServiceType("Timely Access"); end
同时确认你构造GrievanceDTO的参数顺序和字段对应正确:你提到第三个字段是serviceType、第四个是category,你构造时第四个参数传的是"NA",符合规则匹配条件,参数顺序没问题。
4. 包扫描范围校验
检查你的GrievanceRuleService所在包是否在RuleConfiguration配置的@ComponentScan("dm.vantage.producer.service")扫描范围内,如果不在请调整扫描路径,否则Spring不会创建GrievanceRuleService的Bean,也会导致注入失败。
内容的提问来源于stack exchange,提问作者cluis92
相关产品推荐
相关产品推荐

