1

当我不希望出现异常时,我遇到了一些麻烦。这是我的两门课:

public List<ErrorResponse> validate()
{
    List<ErrorResponse> errors = new ArrayList<ErrorResponse>();

    try
    {
        Users user = userManager.findByCompany(job.getCompanyId().getId());
    }
    catch (Exception e)
    {
        ErrorCodes err = ErrorCodes.CODE101;
        errors.add(new ErrorResponse(err.getCode(), err.getMessage()));
    }
}


public Users findByCompany(Integer companyId) 
        throws UserNotFoundException, UsernameNotProvidedException
{
    if (username == null)
    {
        throw new UserUsernameNotProvidedException();
    }

    TypedQuery<Users> query = em.createNamedQuery("Users.findByCompany", Users.class);
    query.setParameter("companyId", companyId);
    try
    {
        Users result = query.getSingleResult();
        return result;
    }
    catch (NoResultException e)
    {
        throw new UserNotFoundException();
    }
    catch (NonUniqueResultException e)
    {
        throw new UserNotFoundException();
    }
    catch (Exception e)
    {
        throw new UserNotFoundException();
    }
}

好的 - 所以 validate() 方法调用 findByCompany() 方法(在另一个类中)。抛出的异常是 findByCompany() 方法中的运行时“NonResultException”(这是正确的)。然后用相同的方法捕获,并抛出我的应用程序异常“UserNotFoundException”。这现在应该传播到 validate() 方法,它应该在“catch(Exception e)”中被捕获。但是,validate() 中的“catch(Exception e)”反而捕获了“EJBTransactionRolledBackException”,这不是我想要的——如果没有找到结果,应用程序应该继续。

当然,通过捕获运行时异常并抛出我的应用程序异常(再次在 validate() 方法中捕获它),应该避免回滚吗?

提前致谢。

4

1 回答 1

2

扩展RuntimeException或未RemoteException注释的@ApplicationException异常被视为系统异常,因此包装在EJBException.

您可能想要抛出已检查的异常(可能不会)或注释您的异常类。

这也可以在部署描述符 XML 中配置,但我不知道细节。

于 2013-11-07T10:04:47.463 回答