CDI注入EJB会导致NullPointerException

Phi*_*kus 9 java cdi java-ee-6 ejb-3.1 glassfish-3

我是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;
    }    

}
Run Code Online (Sandbox Code Playgroud)

我试图将@Produces注释直接应用于上面显示的方法字段.

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

@Inject
private NewsEntryFacadeLocal newsEntryFacade;
Run Code Online (Sandbox Code Playgroud)

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

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

奇怪的是,当我尝试将@Inject EJB添加到Web应用程序部分时,它似乎是这样工作的(但是我需要在我的.war中使用额外的生成器类来实现这一点,这是应该的吗?).

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

小智 0

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