所以问题很简单:
我们使用 JSF 2.0 与 Primefaces 和 EJB 来处理我们的应用程序,但遇到了问题。我们有一个单@SessionScoped
我们存储所有的bean@Stateful Session Beans
.
在一种情况下(当我们没有处理 JPA 的一些异常时)并且存在一个异常:
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "webuser_idwebuser_pk"
Detail: Key (idwebuser)=(6) already exists.
它会导致我们之一的毁灭@Stateful Session Bean
。
因此,刷新网站后,当 JSF 仍然正常工作时,在填写表单并尝试提交后,通过调用该 Bean 中的方法会出现异常:
javax.ejb.NoSuchObjectLocalException: The EJB does not exist. session-key: 22900a4d007e1f-6dcc714a-0
最有问题的是,我们必须重新启动并重新部署应用程序才能使其在同一台计算机(或 Web 浏览器)上运行,因为 JSF 的@SessionScoped
Bean 以某种方式通过 cookies 或其他东西保存。
所以我想解决方案是强制销毁它@SessionScoped
或以某种方式刷新会话,但实际上我不知道该怎么做。
或者什么是更好的方法。
Thanks!
为了解决这个问题,您需要了解 EJB 中应用程序异常和系统异常之间的区别。
这些大致分别对应于检查异常和运行时异常。
应用程序异常应该由您自己的代码处理,并且不会导致事务回滚或 bean 破坏。系统异常具有相反的效果,会导致回滚和EJB bean 的破坏。
后一个效果就是你所看到的。 JPA 抛出未经检查的异常,从而成为系统异常,从而导致您的 SFSB 被破坏。 JSF 或 CDI 托管 bean 都会参与此“系统异常”事件,因此它们只会传播异常并保持活动状态。
您可能想要的是定义一个新的异常,并用 @ApplicationException 进行注释,然后将其回滚属性设置为 true。捕获 SFSB 中的 JPA 异常,并用您的自定义异常包装并重新抛出它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)