为什么CDI注入无法在某些模块中工作,而在其他模块中却无法工作?

时间:2011-07-28 12:55:10

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

在我的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的位置。

更新:经过一天的实验后,更新了详细说明。

2 个答案:

答案 0 :(得分:1)

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

我刚刚将系统更新为Glassfish 3.1.1和JDK 7,问题不再发生。

答案 1 :(得分:0)

根据我最近在Weblogic上的经验,我发现包含下划线的名称空间会阻止EJB模块注入任何bean。

我建议您也尝试使用Glassfish。

致谢!