我在将 Drools 与 Spring 集成时遇到问题。我正在尝试制作一个简单的 Hello World spring 示例,我遇到了我的简单项目拒绝编译的时刻。
要使用像 @KSession 这样的 Drools 注释,我需要 drools-spring 包,但它似乎与 Spring 3 不兼容。作为构建器,我使用 Maven。这是我的 .pom 的样子:
<dependencies>
<!-- Drools -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-internal</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-spring</artifactId>
<version>6.0.0.Beta2</version>
</dependency>
<!-- Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Spring 3 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
</dependencies>
我使用非常简单的 Controller 类:
@Controller
@RequestMapping(value = "/")
public class BaseController extends AbstractController {
private static final Logger log = Logger.getLogger(BaseController.class);
@Autowired
@KSession("ksession-rules")
KieSession mySession;
@RequestMapping(value = "/test")
public @ResponseBody
String test() {
Fact myFact = new Fact();
myFact.setFactNumber(20); //According to my rule when myFact.number>20
//then result will be set to "Hello World"
mySession.insert(myFact);
mySession.fireAllRules();
return myFact.getResult();
}
}
此时我收到一个错误:
“类型 BaseController 的层次结构不一致”。
我注意到,如果我从依赖项列表中删除 drools-spring ,项目就会成功编译。但是,如果没有该包,我无法部署我的项目,因为部署者需要 drools 的类负责解释 @KSession 并且该类位于 drools-spring 包中。
经过一番调查,我的 Drools session 配置似乎有 与上述错误无关,因此为了简洁起见,我不会引用它们。相反,我将标记即使我不对 spring 配置进行任何修改并从示例中删除 KieSession,使其成为一个简单的 spring hello world 示例,我也会从 IDE 中收到一个相同的错误(Eclipse ):“BaseController 类型的层次结构不一致”,如果我删除 drools-spring 依赖项,问题就会消失。
在我看来这是依赖冲突。
有人在 drools+spring 上遇到过类似的问题吗?
有人可以建议解决该问题吗?
我做错了什么吗?
感谢您的帮助!
最佳答案
经过一番研究,我发现了两件事。
Drools 的 drools-spring 包声明了它自己的 spring 依赖项,这些依赖项覆盖了我的 spring 依赖项,这会导致 spring 故障。我所做的是手动从 drools-spring .pom 文件中删除 spring 依赖项。 我在上例中犯的另一个错误是我没有 kie-spring 作为依赖项。 Kie-spring 对于一个 drools bean KModuleBeanFactoryPostProcessor 是必需的,它负责从 spring 配置中读取我的 kmodule-kbase-ksession 配置。
解决这两个问题后,我的项目现在可以编译,我可以在代码中看到 KModuleBeanFactoryPostProcessor 定义我的配置正在按照我的预期被读取和分析。
关于java - Spring 3 与 Drools 6 maven 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22598430/