CDI Внедрение EJB приводит к NullPointerException

Я новичок в Java EE 6 и CDI. Я прочитал несколько руководств и документацию по сварке. Однако то, что должно работать, исходя из моего понимания, не так, поэтому мне нужна помощь.

У меня следующая ситуация. Я создал приложение Java EE 6 с NetBeans 7.0.1, используя архетип maven, поставляемый с IDE, и я развертываю его в GlassFish 3.1, также поставляемом с IDE.

beans.xml находится в каталоге META-INF моего файла EJB jar.

Я создал класс, который работает только как класс производителя для моих артефактов 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 непосредственно к полям и методам, как показано выше.

Однако следующее не внедряет ничего в другой EJB

@Inject
private NewsEntryFacadeLocal newsEntryFacade;

Это делается в сеансе ejb без сохранения состояния, но когда я пытаюсь получить доступ к newsEntryFacade в любом из моих бизнес-методов, выдается исключение NullPointerException. Итак, очевидно, что инъекции не происходит, или мои продюсеры производят нулевые ссылки.

Я что-то упускаю? Или должна эта работа в соответствии с CDI / Weld?

Как ни странно, похоже, что это работает, когда я пытаюсь @Inject EJBs в часть веб-приложения (однако мне понадобилось лишнее продюсер класс в моем .war, чтобы это работало, так и должно быть?).

РЕДАКТИРОВАТЬ: проект работает со сборкой муравья (сгенерированной NetBeans). Есть ли проблемы с архетипом Maven, предоставляемым NetBeans? Похоже, что с архетипом Maven есть некоторые проблемы с внедрением CDI между модулями war и ejb. Я обнаружил, что если бы у меня были отдельные производители в веб-модуле и ejb-модуле, Glassfish генерировал ошибку развертывания, заявляя, что существуют две неразличимые реализации интерфейса. Но когда я удаляю производителя в веб-модуле, Weld жалуется, что EJB, который я хочу внедрить в свои beans в веб-модуле, не может быть разрешен.Также с помощью сборки Ant EJB можно @Injection без производителя, в то время как сборка maven нуждается в полях производителя в классе. Я не могу объяснить, как это могло случиться. В конце концов, окончательное развертывание должно быть более или менее равным, не так ли?

9
задан Philip Markus 18 November 2011 в 10:56
поделиться