【问题标题】:How to use Spring's Dependency Injection in Java EE 6 (WebSphere 8.5)?如何在 Java EE 6 (WebSphere 8.5) 中使用 Spring 的依赖注入?
【发布时间】:2015-10-15 15:25:37
【问题描述】:

我们有一个基于 Spring 的应用程序,它由多个 Java EE 5 Web 模块组成,并且在 WebSphere Application Server 8.5 中运行良好。我们使用来自javax.inject 的标准注解,例如@Inject。 Spring 根据 Spring xml 文件中的 bean 定义解决了这个问题。

现在,如果我们将应用程序升级到 Java EE 6,应用程序服务器的 CDI 将尝试解析 @Inject 并且肯定会失败,因为我们所有的 bean 都是在 Spring 上下文中定义的,而不是在 CDI 上下文中定义的(我们没有 @ 987654324@).

是否可以强制 Spring 继续处理 Java EE 6 容器(WebShpere 8.5)中的@Inject? IE。禁用 CDI?还是升级到 Java EE 6 会迫使我们使用 CDI?

【问题讨论】:

  • 是您的假设还是它的工作原理?您确定您的模块中缺少 beans.xml 吗?
  • 问题出现是因为我目前正在将我的 JEE5 应用程序升级到 JEE6,并且在运行一些测试时,WebSphere 8.5.5.7 无法解析 Inject 注释,并且在日志中我发现了这个错误:“CWOWB0102E:发生 JCDI 错误:JCDI 运行时无法解析 @Inject java.lang.reflect.Method.setSessionValidator(SecureSessionValidator),因为 IBMBeanManager 为空。因此,似乎 WebSPhere 的 CDI 运行时启动了,尽管我的 Web 模块中没有 beans.xml。我想那是一个错误,因为只有在 beans.xml 存在时才应该激活 CDI。

标签: spring websphere cdi java-ee-6


【解决方案1】:

如果您的部署存档中没有 beans.xml,那么 CDI 将不会启动并让 Spring 核心运行。

【讨论】:

  • 同意 CDI 仅在您拥有 beans.xml 时才有效。我不能从经验中肯定地说,如果你不这样做,Spring 对这些注释的处理是否仍然有效。
  • 是的,没错。我在docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html 的 JEE6 教程中找到了相同的语句
  • 唯一失败的情况是你把@Inject放到一个servlet中。但我想春天你永远不会那样做?
【解决方案2】:

我在 WebSphere Liberty V17.0.0.2 上遇到了同样的问题。

在我的例子中,no beans.xml 在类路径中,但 Weld CDI 仍然在 Spring 之前加入(它是一个基于 Spring 的 JSF 应用程序)。

我停用 Welds 注释扫描的方法是将以下 beans.xml 添加到应用程序 WEB-INF 文件夹:

<?xml version="1.0" encoding="UTF-8"?>
<beans ... version="1.1" bean-discovery-mode="none">
</beans>

如您所见,bean-discovery-mode 属性已设置为none。这为我解决了这个问题。

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 2014-11-23
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多