为什么抛出EJBException而不是NoResulException?

时间:2017-02-02 15:55:43

标签: jsf java-ee exception-handling ejb

我不知道为什么我无法捕获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.

1 个答案:

答案 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的子类。    (“未经检查的例外”)。