gpt4 book ai didi

java - EJB 的 CDI 注入(inject)导致 NullPointerException

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:17 25 4
gpt4 key购买 nike

我是 Java EE 6 和 CDI 的新手。我已经阅读了一些教程和焊接文档。然而,根据我的理解,一些应该起作用的东西并没有起作用,所以我需要帮助。

我有以下情况。我使用 IDE 提供的 maven 原型(prototype)使用​​ 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)任何东西

@Inject
private NewsEntryFacadeLocal newsEntryFacade;

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

我错过了什么吗?或者应该根据 CDI/Weld 这是否可行?

奇怪的是,当我尝试将 EJB 注入(inject) Web 应用程序部分时,它似乎是这样工作的(但是我需要在我的 .war 中有一个 extra 生产者类才能工作,是这样的吗应该是?)。

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

最佳答案

如果你想使用 @Inject 然后将它注释为 @Named @ApplicationScoped,否则在注入(inject)你的单例时使用 @EJB

关于java - EJB 的 CDI 注入(inject)导致 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com