【问题标题】:CDI Injection of an EJB leads to NullPointerExceptionEJB 的 CDI 注入导致 NullPointerException
【发布时间】:2011-11-17 18:23:24
【问题描述】:

我是 Java EE 6 和 CDI 的新手。我已经阅读了一些教程和焊接文档。但是,根据我的理解应该可行的事情并不因此我需要帮助。

我有以下情况。我使用 IDE 提供的 maven 原型创建了一个带有 NetBeans 7.0.1 的 Java EE 6 应用程序,并部署到了 IDE 提供的 GlassFish 3.1。

beans.xml 位于我的 EJB jar 的 META-INF 目录中。

我创建了一个类,它作为我的 EJB 工件(和 EntityManager)的生产者类单独工作

@Stateless
public class EjbArtifactProducer {

    @PersistenceContext(unitName = "trackProfiler-PU")    
    private EntityManager em;

    @EJB
    private UserFacadeLocal userFacade;

    @EJB
    private AuthServiceLocal authService;

    @EJB
    private NewsEntryFacadeLocal newsEntryFacade;

    @EJB
    private RoleFacadeLocal roleFacade;

    @EJB
    private TrackCommentFacade trackCommentFacade;

    @EJB
    private TrackFacade trackFacade;

    @EJB
    private TrackTypeFacade trackTypeFacade;

    @EJB
    private WaypointFacadeLocal waypointFacade;

    @Produces
    public AuthServiceLocal getAuthService() {
    return authService;
    }

    @Produces
    public EntityManager getEm() {
    return em;
    }

    @Produces
    public NewsEntryFacadeLocal getNewsEntryFacade() {
    return newsEntryFacade;
    }

    @Produces
    public RoleFacadeLocal getRoleFacade() {
    return roleFacade;
    }

    @Produces
    public TrackCommentFacade getTrackCommentFacade() {
    return trackCommentFacade;
    }

    @Produces
    public TrackFacade getTrackFacade() {
    return trackFacade;
    }

    @Produces
    public TrackTypeFacade getTrackTypeFacade() {
    return trackTypeFacade;
    }

    @Produces
    public UserFacadeLocal getUserFacade() {
    return userFacade;
    }

    @Produces
    public WaypointFacadeLocal getWaypointFacade() {
    return waypointFacade;
    }    

}

我尝试将@Produces 注解直接应用于字段和on 方法,如上所示。

但是以下内容不会在另一个 EJB 中注入任何内容

@Inject
private NewsEntryFacadeLocal newsEntryFacade;

这是在无状态会话 ejb 中完成的,但是当我尝试在我的任何业务方法中访问 newsEntryFacade 时,会抛出 NullPointerException。很明显,没有发生注入,或者我的生产者产生了空引用。

我错过了什么吗?或者应该根据 CDI/Weld 进行这项工作吗?

奇怪的是,当我尝试 @Inject EJB 到 Web 应用程序部分时,它似乎以这种方式工作(但是我需要一个 extra 生产者类在我的 .war 中才能工作,是这样吗?应该是?)。

编辑:该项目使用 ant 构建(由 NetBeans 生成)。 NetBeans 提供的 Maven 原型是否存在问题?在 Maven 原型中,war 和 ejb 模块之间的 CDI 注入似乎存在一些问题。我发现如果我在 web 和 ejb 模块中有单独的生产者,Glassfish 会生成一个部署错误,指出有两个无法区分的接口实现。但是当我在 web 模块中删除生产者时,Weld 抱怨我想注入到 web 模块中的 bean 中的 EJB 无法解析。同样使用 Ant 构建 EJB 可以在没有生产者的情况下进行 @Injected,而 maven 构建需要类上的生产者字段。我无法解释这怎么会发生。毕竟最终部署应该或多或少相等,不是吗?

【问题讨论】:

  • 您尝试注入的另一个 EJB,它是在同一个 EJB Jar 中还是在另一个存档中?注意:要启用 bean-discovery(或 CDI),bean.xml 应该存在于每个部署档案中。在 .wars 的 WEB-INF 和 .jars 的 META-INF 中
  • 我尝试将我的项目转换为 ant 构建。现在一切正常。我什至不再需要为 war 和 ejb 模块创建单独的生产者了。现在的问题是:maven 原型有什么问题吗?或者有什么特别的注意事项需要考虑?
  • 也许您的@Inject 不在托管 bean 或其他支持注入的 EE 组件中?它是什么/在哪里?
  • 让我烦恼的是,几乎完全相同的代码(一切都相同,除了 EJB 没有生产者定义)适用于 ant 构建,但不适用于 maven 构建。

标签: java java-ee-6 glassfish-3 cdi ejb-3.1


【解决方案1】:

如果要使用@Inject,则将其注释为@Named @ApplicationScoped,否则在注入单例时使用@EJB

【讨论】:

    【解决方案2】:

    乔丹丹尼森是正确的。您正在尝试使用@Inject 和EJB,但您将@EJB 用于EJB。你的 EJB 类可能用@Stateless 或其他东西注释。 @Inject 应该用在带有 @Named 和某种范围注释的会话 bean 上。

    【讨论】:

      【解决方案3】:

      很难说哪里出了问题,但绝对不适合我们的是在类加载器边界之间使用 CDI。例如,如果您的应用程序被打包为一个 ear 文件,那么您的 ejbs 将放在一个 jar 文件中,而您的 webapp 将放在您的 war 文件中。在这种情况下,您不能使用 CDI 在 Web 层中注入您的 ejb。问题是jar和war是由不同的类加载器加载的。也许较新的 CDI 实现表现不同,但至少 JBoss 6 和 Glassfish 有这个问题。

      【讨论】:

        【解决方案4】:

        尝试将@Named 放入EjbArtifactProducer。另外,如果产品是这种简单的,我认为最好也将其删除(否则,您应该再做一次更改)。

        【讨论】:

          【解决方案5】:

          您混合了两个不同的概念...使用 CDI 作为 JSF 的支持 bean。 (Web Container 中的 CDI)并在业务层使用 EJB 和 JPA……CDI 层可以注入一个 EJB 来调用具体的业务方法。

          在这种情况下,您可以清楚地分离关注点。

          顺便说一句:您根本不需要任何 EJB 接口!如果您需要从远程...(@Remote)进行通信,请仅使用接口。使用 @LocalBean 注释,您可以直接注入 EJB 本身..

          如果您对每个层都有自己的关注点,我认为您最好找到此 NullPointerException 的原因。我认为您的 NullPointerException 在此之后不再存在...

          分层:

          Web 浏览器 --> JSF Facelet --> CDI 支持 Bean --> EJB 服务 --> EntityManager

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-12
          • 2012-10-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多