我不知道为什么我无法捕获EJB中的方法抛出的NoResultException ...
try {
User user = userFacade.findByEmail(email);
userController.setSelected(user);
getSelected().setUserOid(user.getOid());
} catch (NoResultException noResultException) {
JsfUtil.addErrorMessage("No user found with provided email");
System.err.println(noResultException.getMessage());
} catch (EJBException e){
System.err.println(e.getMessage());
}
EJB
@Stateless
public class UserFacade extends AbstractFacade<User> {
...
public User findByEmail (String email) throws NoResultException{
User user = em.createNamedQuery("User.findByEmail", User.class).
setParameter("email", email).getSingleResult();
return user;
}
...
为什么此代码捕获EJBException而不是NoResultException,如何捕获NoResultException?
Avvertenza: javax.ejb.EJBException
...
...
Caused by: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities.
答案 0 :(得分:4)
直接向客户端报告应用程序异常,即不包含在EJBException
中(注意:在容器管理的事务划分的情况下,客户端看到{{1}而不是)。
NoResultException
是一个系统异常,这意味着EJB容器会将该异常包装在EJBTransactionRolledbackException
中。
将@ApplicationException
注释应用于异常,使其成为应用程序异常。在这种情况下,您可能希望将EJBException
包装在您自己的NoResultException
(或类似物)中,并带有所述注释。
EJB规范如下所示......
系统异常是一个异常,它是java.rmi.RemoteException(或其子类之一)或RuntimeException,它不是应用程序异常。
应用程序异常是Bean Provider定义的异常,作为应用程序业务逻辑的一部分。应用程序异常与本规范中的系统异常不同。
现在是重要的部分:
企业bean实例抛出的应用程序异常应该准确地报告给客户端(即客户端获得相同的异常)
规范继续澄清应用程序异常的作用和用法:
企业bean业务方法使用应用程序异常来通知客户端异常的应用程序级条件,例如业务方法的输入参数的不可接受的值。 客户端通常可以从应用程序例外中恢复。
应用程序异常可以是java.lang.Exception的子类(直接或间接)(即“已检查的异常”),或者应用程序异常类可以定义为java.lang.RuntimeException的子类。 (“未经检查的例外”)。