Почему метод сессионного компонента генерирует исключение EjbTransactionRolledbackException при создании RuntimeException - PullRequest
5 голосов
/ 25 сентября 2010

Я пытаюсь сохранить сущность с проверкой ограничения, при вызове persist - возникает выбрасываемое ограничение, и вызывающий получает EjbTransactionRolledbackException ... поэтому я пытаюсь вызвать явную проверку и бросить ConstraintViolationException / RuntimeExceptionи все же вызывающий абонент получает EjbTransactionRolledbackException ... когда я выбрасываю MyException extends Exception - вызывающий абонент получает MyException

Даже когда я вызываю явное sc.setRollBackOnly, это все равно происходит: (

Это не должно быть поведение.

что происходит?

Конфигурация:

Netbeans 6.9.1 Glassfish 3.0.1 JPA 2.0 (EclipseLink) EJB 3.1

Спасибо !!!

@Stateless
public class My {

@PersistenceContext
EntityManager em;

@Resource
Validator  validator;

public Order checkout(Order order) {
    Set<ConstraintViolation<Order>> set = validator.validate(order, Default.class);

    if (!set.isEmpty()) {
        sc.setRollbackOnly();
        //throw new ConstraintViolationException(new HashSet<ConstraintViolation<?>>(set));
        throw new RuntimeException();
    }

    this.em.persist(order);
}

1 Ответ

10 голосов
/ 25 сентября 2010

, поэтому я пытаюсь вызвать проверку явным образом и выбрасывать ConstraintViolationException / RuntimeException, и вызывающая сторона получает EjbTransactionRolledbackException ...

Предоставление полной трассировки стека может помочь.В любом случае, мне интересно, как вы вызываете свой EJB, и если вы распространяете транзакцию, и в этом случае выбрасывание EJBTransactionRolledbackException - правильное поведение в случае системного исключения.Но может помочь следующее сообщение в блоге:

Нарушено ограничение, откат транзакции

При использовании проверки бина на сущностях JPA в бине EJB 3 вы бы фактическиполучить EJBTransactionRolledbackException, если есть нарушение ограничения.

javax.ejb.EJBTransactionRolledbackException: Invalid object at persist time for groups [javax.validation.groups.Default, ]
Caused by: javax.validation.ConstraintViolationException: Invalid object at persist time for groups [javax.validation.groups.Default, ]

Это все хорошо в соответствии со спецификацией, но не очень интересная информация.Вы на самом деле не хотите знать, что произошло, вы хотите знать, что пошло не так.

Поэтому я рекомендую добавить следующее в ваш ejb-jar.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                            http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
        version="3.0">
   <assembly-descriptor>
      <application-exception>
         <exception-class>javax.validation.ConstraintViolationException</exception-class>
         <rollback>true</rollback>
      </application-exception>
   </assembly-descriptor>
</ejb-jar>

Таким образомвы можете получить прямой доступ к вашим нарушениям.

Ресурсы

...