3

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

  1. 我想结合 PrimeFaces 组件为我的托管 bean 使用与 AJAX 相关的范围,例如ViewScope - 或者可能是 MyFaces Orchestra 中的 (View)AccessScope 。

  2. 基于 JPA 的持久性应该相当简单,无需处理 OpenSessionInView 模式等。我在 JPA2 中遇到的主要问题是可怕的LazyInitializationException,尤其是在 AJAX 调用中。我不需要手动控制对话。

  3. 我想使用尽可能少的依赖项,因此主要依赖于 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

到目前为止,这看起来很苗条。缺少的是对更多特定于 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 和其他依赖项)。

我的问题是:

  1. EJB对 LazyInitializationException 有帮助吗?@Stateful还是由于注释,我实际上已经在这里使用了 EJB ?我从一个 jboss-as 示例应用程序中获取了这个,但我对所有这些@ManagedBean, @Named, @Stateful,@LocalBean注释之间的差异感到非常困惑......我所知道的是我需要以某种方式将我的实体管理器的生命周期绑定到服务豆。

  2. 有人知道解决此问题的其他简单方法吗?使用 EAGER 获取不是一种选择,因为这似乎仅在每个实体不超过一个集合的情况下才有效......

  3. 我刚刚阅读了有关Apache CODI的信息,它似乎是 MyFaces Orchestra 的 CDI 继任者。这是Seam Faces的更好替代品吗?据我所知,它提供了 ViewScope 和 ViewAccessScope,但没有涉及事务管理。

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

4

2 回答 2

6

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

回答您的问题

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

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

于 2012-05-31T04:56:22.637 回答
0

老实说,CDI 没有“万能”。Seam3 效果很好,MyFaces CODI 效果很好,这真的取决于你想要什么。老实说,对于您的情况,似乎最简单的做法是为您的项目创建自己的 ViewScoped 扩展,或者从 Seam 3 或 CODI 中提取必要的部分。

于 2012-05-31T03:29:37.307 回答