2017-02-02 3 views
0

Я не знаю, почему я не могу поймать NoResultException сброшенного метода в EJB ...Почему исключение EJBException выбрано вместо NoResulException?

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. 

ответ

3

только исключения применения сообщены клиенту непосредственно, то есть без завернутого в EJBException (примечание: в случае управляемого контейнера демаркации транзакций, клиент видит EJBTransactionRolledbackException вместо этого).

NoResultException однако исключение системы, то есть контейнер EJB будет обернуть это исключение в EJBException.

Примените аннотацию @ApplicationException к исключению, чтобы сделать его исключением приложения. В этом случае вы, вероятно, захотите обернуть NoResultException в свой собственный NoSuchEmailException (или тому подобное), несущий указанную аннотацию.

Спецификация EJB гласит следующее ...

Системные Исключения

Исключение система представляет собой исключение, которое является java.rmi.RemoteException (или один из его подклассов) или RuntimeException, которое не является исключением приложения.

Исключения Применение

Исключение приложение является исключение определяется Поставщиком Bean как часть бизнес-логики приложения. Исключения приложений отличаются от системных исключений в этой спецификации.

И теперь важная часть:

Исключения приложения брошенное экземпляр корпоративного компонента следует сообщать клиент точно (то есть, клиент получает то же самое исключение)

В спецификации даны разъяснения относительно роли и использования исключений в заявке:

Бизнес-методы бизнес-компонента используют исключения приложений, чтобы информировать клиента о ненормальных условиях уровня приложения, таких как неприемлемые значения входных аргументов бизнес-методу. Клиент обычно может восстанавливаться из исключения приложения.

Исключение приложения может быть подклассом (прямым или косвенным) java.lang.Exception (т.е. «проверенным исключением»), или класс исключения приложения может быть определен как подкласс java.lang. RuntimeException. («исключенное исключение»).

Смежные вопросы