处理'EJB不存在'或'无法从BACKUPSTORE FOR Key加载'

Ata*_*ais 2 java jsf ejb exception java-ee

所以问题很简单:

我们正在使用带有Primefaces和EJB的JSF 2.0来处理我们的应用程序,我们遇到了一个问题.我们有一个单独的@SessionScoped豆子,我们存储了所有的豆子@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.
Run Code Online (Sandbox Code Playgroud)

它导致我们之一的毁灭@Stateful Session Bean.所以在刷新网站之后,当JSF仍然正常工作时,在填写表单并尝试提交之后,通过调用该Bean中的方法会有一个异常:

javax.ejb.NoSuchObjectLocalException: The EJB does not exist. session-key: 22900a4d007e1f-6dcc714a-0
Run Code Online (Sandbox Code Playgroud)

什么是最有问题的,我们必须重新启动和重新部署应用程序,使其在同一台计算机(或Web浏览器)上工作,因为JSF的@SessionScopedBean以某种方式通过cookie或其他东西保存.

因此,我想解决方案是强制解决该问题@SessionScoped或以某种方式刷新会话,但实际上我不知道该怎么做.或者什么是更好的方法.

谢谢!

Mik*_*aun 6

要解决这个问题,您需要了解EJB中应用程序和系统异常之间的区别.

这些大致分别对应于已检查和运行时异常.

应用程序异常应该由您自己的代码处理,并且不会导致事务回滚或bean的破坏.系统异常会产生相反的效果,并会导致回滚和EJB bean的破坏.

后者的效果就是你所看到的.JPA会抛出未经检查的异常,从而导致系统异常,从而导致您的SFSB被破坏.JSF和CDI托管bean都参与了这个"系统异常"的事情,所以他们只会传播异常并保持活着.

您可能想要的是定义一个使用@ApplicationException注释的新Exception,然后将其rollback属性设置为true.在SFSB中捕获JPA异常,并使用自定义异常包装并重新抛出它.