注入EntityManager时的奇怪行为

时间:2012-02-23 10:53:31

标签: java-ee-6 cdi

我观察到一些关于注入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 ,它仍为空。

我无法理解这种行为。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:3)

我认为问题在于这一行:

service = new Service();

由于Service是EJB,因此它的生命周期由容器管理。你可以调用new,但我想你不会得到一个EJB而是一个纯java类。

尝试注入Service EJB而不是创建新实例。