gpt4 book ai didi

jakarta-ee - 连接到 Web 模块中的 JSF CDI bean 后,是否可以传递来自 EJB 模块的 CDI 注入(inject) EntityManager?

转载 作者:行者123 更新时间:2023-12-04 04:52:54 25 4
gpt4 key购买 nike

我有一个 web 模块和一个 ejb 模块打包到一个 EAR 中。

我有 JSF 支持 bean 从 ejb 模块成功注入(inject) session EJB,它能够从数据库中提取数据,例如

@RequestScoped
public class CarController {

@EJB
private CarService carService;

为了支持 Primefaces LazyDataModel, session EJB 将它的 EntityManager 暴露给 LazyDataModel:

@PostConstruct
public void init() {
MyLazyDataModel<Car> myLazyDataModel = new MyLazyDataModel<Car>();
myLazyDataModel.setEntityManager(carService.getEntityManager());
super.setMyLazyDataModel(myLazyDataModel);
}

这会导致以下异常:

java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName null
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:132)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.java:173)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.java:895)
at com.cars.web.controller.MyLazyDataModel.load(MyLazyDataModel.java:154)
at org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:731)

这是否不起作用,因为 PersistenceContext 只是一个在 ejb 模块中传递的有效 bean?

最佳答案

出于资源和/或 EJB 注入(inject)的目的,使用 JSF bean 或 CDI bean 是等效的。

我会避免在同一个应用程序中以两种不同的方式(即通过 PersistenceContext 注入(inject)和通过 EntityManagerFactory)检索 EntityManager。特别是 EntityManagerFactory 实例化是一个重量级操作。

如果你让MyLazyDataModel 成为一个匿名内部类,就容易多了,因为你可以直接使用注入(inject)的DAO 服务,不需要直接在bean 中处理EntityManager。你可以在这个 answer 中看到一个具体的例子.

与具体问题无关,惰性数据表最适合的 bean 范围似乎至少是 ViewScoped(仅适用于 jsf bean)。

关于jakarta-ee - 连接到 Web 模块中的 JSF CDI bean 后,是否可以传递来自 EJB 模块的 CDI 注入(inject) EntityManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17286357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com