我正在尝试为满足以下要求的小型研究原型(prototype)和学生项目设置基于 JBoss AS7 的 Web 应用程序堆栈:
现在,我已经建立了一个具有以下(主要提供)Maven 依赖项的项目:
到目前为止,这看起来很 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 和进一步的依赖项)。我的问题是:
@Stateful
注释,我实际上已经在这里使用 EJB?我从 jboss-as 示例应用程序中获取了它,但是我对所有这些 @ManagedBean
、 @Named
、 @Stateful
、 @LocalBean
注释之间的差异感到非常困惑……我所知道的是我需要以某种方式将实体管理器的生命周期绑定(bind)到服务 bean 的范围。 如果在这个领域有更多经验的人可以对此有所了解,那就太好了——我目前有点困惑,因为有太多的图书馆在处理类似的问题,尽管最明显的是彼此不兼容(参见例如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 和 CODI 目前在 Apache Delta Spike 中处于合并过程中,因此您将要构建的解决方案应该在下个月重新评估,以将 Delta Spike 包括在等式中。
关于jsf-2 - 在 JBoss AS7 堆栈(JSF2、CDI、JPA2、Seam?)上拥有 ViewScope 和避免 LazyInitializationException 的最简单方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10820683/