我正在尝试为满足以下要求的小型研究原型(prototype)和学生项目设置基于 JBoss AS7 的 Web 应用程序堆栈:

  • 我想使用 AJAX 相关的范围,例如 ViewScope —— 或者可能是 MyFaces Orchestra 中的 (View)AccessScope —— 用于我的托管 bean,与 PrimeFaces 组件结合使用。
  • 基于 JPA 的持久性应该相当简单,无需处理 OpenSessionInView 模式等。我在 JPA2 中遇到的主要问题是可怕的 LazyInitializationException ,尤其是在 AJAX 调用中。我不需要手动控制对话。
  • 我想尽可能少地使用 依赖项 ,因此主要依赖于 JBoss AS7 附带的内容。

  • 现在,我已经建立了一个具有以下(主要提供)Maven 依赖项的项目:
  • CDI
  • hibernate-2.0-api
  • jboss-ejb-api_3.1_spec
  • jboss-jsf-api_2.1_spec
  • jboss-annotations-api_1.1_spec
  • PrimeFaces 3

  • 到目前为止,这看起来很 slim 。缺少的是对更多 JSF 特定范围的支持,并且在 JSF 页面中迭代集合时我总是得到 LazyInitializationException。现在,我的持久化服务类如下所示:
    import javax.ejb.Stateful;
    import javax.enterprise.context.RequestScoped;
    
    @Stateful @RequestScoped
    public class TestEntityService implements Serializable {
        @PersistenceContext(type=PersistenceContextType.EXTENDED)
        private EntityManager entityManager;
    
        // ... some methods working with the entityManager ...
    }
    

    还有我的 ResourceFactory bean:
    public class ResourceFactory {
        @Produces @PersistenceUnit
        private EntityManagerFactory entityManagerFactory;
    }
    

    我尝试使用 @Named 而不是 @Stateful@SessionScoped 而不是 @RequestScoped 的组合失败。然而,我发现添加 Seam 3 Persistence、Solder & Faces 模块似乎解决了我的大部分问题,但这为我的项目添加了大量新的依赖项(例如,seam-security、prettyfaces、drools、joda-time 和进一步的依赖项)。

    我的问题是:
  • EJB 对 w.r.t. 有任何帮助吗?延迟初始化异常?还是由于 @Stateful 注释,我实际上已经在这里使用 EJB?我从 jboss-as 示例应用程序中获取了它,但是我对所有这些 @ManagedBean@Named@Stateful@LocalBean 注释之间的差异感到非常困惑……我所知道的是我需要以某种方式将实体管理器的生命周期绑定(bind)到服务 bean 的范围。
  • 有人知道解决这个问题的其他简单方法吗?使用 EAGER fetching 不是一种选择,因为这似乎只有在每个实体不超过一个集合时才有效......
  • 我刚刚读到 Apache CODI ,它似乎是 MyFaces Orchestra 的 CDI 继承者。这是 Seam Faces 的更好替代品吗?据我所知,它提供了一个 ViewScope 和 ViewAccessScope,但没有关于事务管理。

  • 如果在这个领域有更多经验的人可以对此有所了解,那就太好了——我目前有点困惑,因为有太多的图书馆在处理类似的问题,尽管最明显的是彼此不兼容(参见例如here)。谢谢!

    最佳答案

    你是对的。所有这些都非常令人困惑。这种混淆来自 JSF2 和 CDI 提供相同的功能。由于这两个规范需要在没有其他规范的情况下工作,因此它们对 Scope 和 EL 说明有类似的注释。这个 blog post 详细说明了这些令人困惑的领域以及如何做出正确的选择。简而言之,当将 CDI 与 JSF 一起使用时,请始终使用 CDI 注释,或 CDI 将通过扩展控制的注释(当您的项目中有 Seam Faces 或 CODI 时,作为 javax.faces.ViewScoped)

    回答您的问题

  • 您已经在使用带有 @Stateful 注释的 EJB。 EJB 不会直接帮助您使用 LazyInitializationException,但它们是处理事务和数据库的更自然的选择(您不能在 pojo CDI bean 中使用 @PersistenceContext 注释)。关于令人困惑的注释,我已经回答了
  • 我对 Seam Persistence 有很好的经验。这个 CDI 扩展创建了一个托管的实体管理器,它存在于对话中,并允许在 EJB 之外使用事务(如果您没有 Java EE 容器)。使用此实体管理器可显着减少延迟加载问题。由于 CDI 魔法允许注入(inject)不同范围的 Bean,它可以注入(inject)到无状态 EJB 中,该 EJB 管理您的 DAO。与 Seam Faces 结合使用,您将获得 JSF ViewScope 对 CDI 的支持以及与 JSF 生命周期相关的事务
  • 我对 CODI 没有任何经验,它似乎带来了诸如嵌套对话之类的有用功能。

  • 总之,请注意,Seam 和 CODI 目前在 Apache Delta Spike 中处于合并过程中,因此您将要构建的解决方案应该在下个月重新评估,以将 Delta Spike 包括在等式中。

    关于jsf-2 - 在 JBoss AS7 堆栈(JSF2、CDI、JPA2、Seam?)上拥有 ViewScope 和避免 LazyInitializationException 的最简单方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10820683/

    10-12 17:52