Pregunta ¿Por qué el método de sesión Bean arrojó EjbTransactionRolledbackException cuando se lanzó RuntimeException?


Intento persistir a la entidad con la validación de la restricción, cuando persiste la invocación, hay una restricción que se produce y la persona que llama obtiene EjbTransactionRolledbackException... así que intento llamar a la validación explícita y lanzar ConstraintViolationException/RuntimeException y aún así la persona que llama obtiene EjbTransactionRolledbackException... cuando tiro MyException se extiende Exception - la persona que llama recibe MyException

Incluso cuando llamo explícito sc.setRollBackOnly todavía está sucediendo :(

Este no debería ser el comportamiento.

¿que esta pasando?

Configuración:

Netbeans 6.9.1 Pez de cristal 3.0.1 JPA 2.0 (EclipseLink) EJB 3.1

¡¡¡Gracias!!!

@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);
}

5
2017-09-25 11:45


origen


Respuestas:


así que trato de llamar a la validación explícita y lanzar ConstraintViolationException / RuntimeException y todavía la persona que llama obtiene EjbTransactionRolledbackException ...

Proporcionar el apilamiento completo podría ayudar. De todos modos, me pregunto cómo está llamando a su EJB y si está propagando una transacción, en cuyo caso arrojar una EJBTransactionRolledbackException es el comportamiento correcto en caso de una excepción del sistema. Pero la siguiente entrada de blog podría ayudar:

Restricción de la restricción, la transacción retrocedió

Cuando se usa la validación de bean en JPA   entidades dentro de un bean EJB 3 que   en realidad obtendría un   EJBTransactionRolledbackException if   Hay una violación de restricción.

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, ]

Todo esto está muy bien de acuerdo a   especificación, pero no realmente   información interesante. Tu no   Realmente quiero saber que paso, tu.   Quiero saber qué salió mal.

Entonces recomiendo agregar lo siguiente a   su 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>

De esa manera puede acceder directamente a su   violaciones

Recursos


10
2017-09-25 12:27