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的@SessionScoped
Bean以某种方式通过cookie或其他东西保存.
因此,我想解决方案是强制解决该问题@SessionScoped
或以某种方式刷新会话,但实际上我不知道该怎么做.或者什么是更好的方法.
谢谢!
要解决这个问题,您需要了解EJB中应用程序和系统异常之间的区别.
这些大致分别对应于已检查和运行时异常.
应用程序异常应该由您自己的代码处理,并且不会导致事务回滚或bean的破坏.系统异常会产生相反的效果,并会导致回滚和EJB bean的破坏.
后者的效果就是你所看到的.JPA会抛出未经检查的异常,从而导致系统异常,从而导致您的SFSB被破坏.JSF和CDI托管bean都参与了这个"系统异常"的事情,所以他们只会传播异常并保持活着.
您可能想要的是定义一个使用@ApplicationException注释的新Exception,然后将其rollback属性设置为true.在SFSB中捕获JPA异常,并使用自定义异常包装并重新抛出它.
归档时间: |
|
查看次数: |
4822 次 |
最近记录: |