【问题标题】:Why does CDI injection fail to work in a some modules, but not in others?为什么 CDI 注入在某些模块中不起作用,而在其他模块中不起作用?
【发布时间】:2011-07-28 12:55:10
【问题描述】:

在我的 Java EE 项目中,有几个“Java EE”模块和一个 Web 模块。 其中一个 Java EE 模块为 CDI 提供了一个类,供其他模块使用:

@ApplicationScoped
public class XFactory {

  @Produces @Actual
  public X create() {
     return new X();
  }
}

它们被注入

   @SessionScoped
   public class Target implements Serializable {
       X x;

      @Inject
      public void setX(@Actual X x){
        this.x = x;
      }
   }

但是,这只适用于其中一个 Java EE 模块和 web 模块。在所有剩余的 Java EE 模块中,注入始终失败,我不知道为什么:我得到的只是 WELD-1408,不满足的依赖项

所有模块在适当的位置都有beans.xml,只要我不切换到注入,它们都可以工作。大多数目标 bean 已经作为 JSF 中的注入 bean 使用。 Java EE 模块的特别之处在于,bean 被注入到 web 模块中的 servlet,而不是 JSF。

该项目在 GlassFish 3.1 中使用 Java EE 6、EJB 3.1 运行。依赖关系由 Maven 3 管理。X 本身就是Serializable,以满足钝化范围。

您以前遇到过这种情况吗?我做错了什么?

更新:上面添加了依赖管理备注。

更新:更正了@ActualTarget中的位置。

更新:经过一天的实验,更新了描述,提供了更多细节。

【问题讨论】:

  • 目前还没有答案。我将一步一步地重写模块,看看在什么时候注入失败。不过,仍然感谢您的意见。
  • 似乎比我最初想的要多。我关于在该单个项目之外一切正常的说法可能是错误的:即使在最简单的模块中,注入也会失败。我开始想知道为什么它在其中一个中起作用。

标签: java jakarta-ee dependency-injection cdi jboss-weld


【解决方案1】:

这似乎是 Glassfish 3.1、其中一个包含的库或 JDK 6 中的问题。

我刚刚将系统更新到 Glassfish 3.1.1 和 JDK 7,问题不再出现。

【讨论】:

  • 在接受答案之前,我将在将Xs 替换为生产代码时进行更多调查。
【解决方案2】:

在我最近使用 Weblogic 的经验中,我发现包含下划线的命名空间会阻止 EJB 模块注入任何 bean。

我建议你也试试 Glassfish。

问候!

【讨论】:

  • 你知道这个问题在 9 年前就已经回答了吗?
  • 您是否意识到我的回答将来可能对其他人有用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 2022-06-14
  • 2018-11-12
  • 2017-05-28
  • 1970-01-01
相关资源
最近更新 更多