【发布时间】: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