我观察到一些关于注入EntityManager的奇怪行为。
以下是工作代码的精简版:
Bean.java
@RequestScoped
@Named
public class Bean {
@Inject
private Service service; // +getter
// few variables + getters/setters
public String getMessage() {
return getService().message();
}
}
Service.java
@Stateless
@LocalBean
public class Service {
@PersistenceContext
private EntityManager entityManager; // +getter
public String message() {
return "[" + getEntityManager() + "]";
}
}
cdi.xhtml
<h:body>
<h:outputText value="#{bean.message}" />
</h:body>
但我需要做一些处理,同时创建 服务 。因此在工厂类中添加了以下生产者方法。
@Produces
@QService
public Service createService() {
Service service;
service = new Service();
// Some processing
return service;
}
并在 Bean 类的注入点添加了相同的限定符 QService 。
@Inject
@QService
private Service service; // +getter
现在,EntityManager在 服务 类中注入了 NOT ,它仍为空。
我无法理解这种行为。有人可以解释一下吗?
答案 0 :(得分:3)
我认为问题在于这一行:
service = new Service();
由于Service
是EJB,因此它的生命周期由容器管理。你可以调用new
,但我想你不会得到一个EJB而是一个纯java类。
尝试注入Service EJB而不是创建新实例。