【发布时间】:2018-01-19 20:26:45
【问题描述】:
我在 Spring Boot 应用程序中使用以下 drools 配置文件从在本地运行良好的数据库加载/执行规则,但是当我尝试将应用程序部署到服务器时,我收到一个错误,提示找不到 KieModule Bean。我将丢失的 KieModule Bean 添加到我的配置文件中,现在我收到另一个错误Failed to instantiate [org.kie.api.runtime.KieContainer]: Factory method 'kieContainer' threw exception; nested exception is java.lang.RuntimeException: Cannot find KieModule: org.default:artifact:1.0.0-SNAPSHOT。我的问题是 1)为什么我需要这个 Bean 和 2)为什么应用程序在没有丢失 Bean 的情况下在本地构建/运行?
如果它是部署应用程序所需的强制 Bean,我是否需要通过向我的应用程序/POM 添加一些属性来专门为我的环境配置它??
public class DroolsDataBaseConfig {
@Autowired
private DataService dataService;
@PostConstruct
public void loadResourcesFromDatabase() {
try {
KieHelper helper = getKieHelper();
List<Rule> rulesFromDB = dataService.findAllRules();
for (Rule rule : rulesFromDB){
String ruleAsStr = rule.getRule();
helper.addContent(ruleAsStr, ResourceType.DRL);
}
helper.build(getKieServices().newKieBaseConfiguration());
} catch (Exception ex) {
log.error("Exception occured loading rules from Database. Exception is : " + ex);
}
}
@Bean
@ConditionalOnMissingBean(KieContainer.class)
public KieContainer kieContainer() throws IOException {
final KieRepository kieRepository = getKieServices().getRepository();
return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
@Bean
@ConditionalOnMissingBean(StatelessKieSession.class)
public StatelessKieSession statelessKieSession() throws IOException {
return kieContainer().newStatelessKieSession();
}
private KieServices getKieServices() {
return KieServices.Factory.get();
}
@Bean
@ConditionalOnMissingBean(KieHelper.class)
public KieHelper getKieHelper() throws IOException {
return new KieHelper();
}
@Bean
@ConditionalOnMissingBean(KieModule.class)
public KieModule kieModule() throws IOException {
return new KieModule() {
public ReleaseId getReleaseId() {
return getKieServices().getRepository().getDefaultReleaseId();
}
};
}
@Bean
@ConditionalOnMissingBean(KieBase.class)
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
}
}
【问题讨论】:
-
对于以后遇到这个问题的人来说,这个错误非常具有误导性!原来是我在数据库中的一条规则无法编译的问题。一旦我删除了有问题的规则,应用程序就可以正常启动了。
-
同样的例外,但正如你所说,问题出在我的规则操作部分