Я новичок в 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 нуждается в полях производителя в классе. Я не могу объяснить, как это могло случиться. В конце концов, окончательное развертывание должно быть более или менее равным, не так ли?