我正在尝试构建一个web (Spring)应用程序,通过注入集成kie (drools 6)。我已经使用kie工作台创建了一个工作流,并进行了编译和部署。我在我的项目的pom.xml中添加了这个工件的引用,并按照这篇博客文章添加了本地kie-工作台存储库,并且它工作得很好(在maven/spring项目中将工件作为依赖项提取)。我想要做的是在我的一个服务中注入kiesession作为依赖项,下面是代码片段-
@Service
public class TniServiceImpl implements TniService {
@Inject
@KSession("tniSession")
private KieSession tniSession;
...
}在root-context.xml中,我添加了kie命名空间以及对xsd的引用。我添加了org.kie.spring.KModuleBeanFactoryPostProcessor和drools文档。我正在尝试使CDI注入工作于KSession扫描和注入(它已经在使用@Inject为我在同一个项目中的其他组件工作)。到目前为止,我总是得到“没有找到类型为依赖的org.kie.api.runtime.KieSession类型的合格bean”错误。看起来spring无法扫描其中可用的kie模块和会话。需要你的帮助-
我的环境是-
我已经通过了下面的链接,但没有运气(主要是他们没有试图做我的事情)-
如果有人能指导我这里缺少的部分,或者除了在spring配置文件中显式定义所有k模块/ksession之外,我将非常感激。
发布于 2014-03-13 11:30:35
我也遇到了同样的问题,在这里找到了一个解决方案:http://drools.46999.n3.nabble.com/Spring-4-0-amp-Drools-6-0-1-Integration-issue-td4028052.html
基本上,您需要注入ApplicationContext而不是kieSession,并手动获取xml。
TniServiceImpl.java
@Service
public class TniServiceImpl implements TniService {
@Inject
ApplicationContext context;
KieSession kieSession;
@PostConstruct
public void postConstruct(){
kieSession = (KieSession) context.getBean("ksession1");
}
...
}root-context.xml
<kie:kmodule id="kmodule1">
<kie:kbase name="kbase1">
<kie:ksession name="ksession1" />
</kie:kbase>
</kie:kmodule>
<bean id="kiePostProcessor" class="org.kie.spring.KModuleBeanFactoryPostProcessor" />希望这能有所帮助。
更新:
实现这一目标的另一种方法是保持xml相同,而不是试图注入KieSession,而是注入KieBase。然后,使用KieBase实例创建新的KieSessions。
@Service
public class TniServiceImpl implements TniService {
@Autowired
private KieBase kbase;
/* inside some method */
@RequestMapping(method=RequestMethod.GET)
public @ResponseBody Data getData() {
KieSession ksession = kbase.newKieSession();
...
}
}发布于 2014-03-21 21:43:06
以上的答案并不适用于spring。我发现这是现有drools中的一个bug,他们正在下一个版本中修复它。由于我在批处理模式中使用DROOLS,所以我在这一点上陷入困境,但我希望它能够在websphere上托管的REST服务中使用。上面的解决方案在批处理程序中完美地工作。
发布于 2017-06-16 20:13:05
这就是我所使用的最新的Spring (Spring )
@SpringBootApplication
public class DroolDemoApplication {
public static void main(String[] args) {
SpringApplication.run(DroolDemoApplication.class, args);
}
@Bean
public KieContainer kieContainer() {
return KieServices.Factory.get().getKieClasspathContainer();
}
@Bean
public KieSession kieSession() throws IOException {
return kieContainer().newKieSession("DroolDemoSession");
}
}下面是kmodule.xml
<kbase name="DroolDemoKbase" packages="rules">
<ksession name="DroolDemoSession" />
</kbase>最后,您在控制器中所做的一切就是
@Autowired
private KieSession kieSession;
kieSession.fireAllRules();希望这能帮助那些仍有问题的人
https://stackoverflow.com/questions/21303349
复制相似问题