当前位置: 首页 > 知识库问答 >
问题:

从EJB模块中注入的CDI EntityManager在连接到web模块中的JSF CDI bean后可以被传递吗?

冷英光
2023-03-14

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

我有JSF支持bean成功地从ejb模块注入会话ejb,这些ejb模块能够从数据库中提取数据,例如。

@RequestScoped
public class CarController {

    @EJB
    private CarService carService;

为了支持Primefaces LazyDataModel,会话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而不起作用?

共有1个答案

虞裕
2023-03-14

出于资源和/或EJB注入的目的,使用JSFbean或CDIBeans是等效的。

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

如果将MyLazyDataModel设为匿名内部类,则会容易得多,因为您可以直接使用注入的DAO服务,而不需要直接在bean中处理EntityManager。你可以在这个答案中看到一个具体的例子。

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

 类似资料:
  • 我在NetBeans中创建了一个带有EJB模块和web模块的Java EE应用程序。业务逻辑驻留在EJB模块内部的EJB中。web模块的托管bean是否可以访问EJB模块内部的EJB?怎么做? (JDK 1.7、Java EE 6、Glassfish 3.1.2.2、NetBeans IDE 7.2)

  • 我有一个EAR应用程序,有三个模块: null 这是工作良好的,但现在我必须使用相同的豆子外耳应用程序,注射是不工作的。 我在app-ejb中有: 以及他在app-remote中的远程界面: 这是意料之中的吗?如何才能正确地注入远程bean?

  • 问题内容: 我有一个需要一些模块。有没有办法可以注入模块本身?我意识到这有点麻烦。 例: 我想在这种情况下,解决方案是将方法转换为完整的类。这显然是一个简化的示例;我正在处理的代码有很多这样的方法,因此将它们分成单独的类并引入配置它们的模块会增加相当多的混乱- 我认为Guice就是要减少样板混乱? 也许这反映了我对Guice的相对呆板,但是我遇到了很多尝试着做上述事情的案例。我肯定错过了什么… 问

  • spring开发人员的一个问题是: 目录作为父目录 目录-EJB(实现) 目录-API(接口)

  • 我创建了ear项目,我有两个模块,命名为:mavenproject4-web mavevnproject4-ejb 我试图从web模块的ejb模块中导入一些接口和实体,但我不能。我尝试通过pom.xmm将ejb模块作为依赖项添加到web模块中,然后我的问题就解决了,这样做对吗? 添加依赖项后,我尝试运行project,并出现了以下异常:

  • 我正在学习企业应用程序开发课程。我是JSF的新手。我正在尝试使用 Glassfish 3.1 使用 JSF 和 Netbeans IDE 部署我的应用程序。 下面列出了我得到的错误。 < code >部署期间出错:准备应用程序时出现异常:无法加载EJB模块。DeploymentContext不包含任何EJB。检查归档文件以确保F:\ Seagate \ docs backup \ netbeans