Perché bean di sessione metodo tiro EjbTransactionRolledbackException quando RuntimeException è stato gettato

StackOverflow https://stackoverflow.com/questions/3793649

Domanda

Sto provando a persistere l'entità con la convalida di vincolo, quando invoke persistono - non c'è vincolo che gettato e il chiamante get EjbTransactionRolledbackException ... così cerco di chiamare la convalida esplicito e tiro ConstraintViolationException / RuntimeException e ancora il chiamante get EjbTransactionRolledbackException ... quando butto MyException estende Exception - il chiamante ottenere MyException

Anche quando chiamo sc.setRollBackOnly esplicito è ancora accaduto: (

Questo non dovrebbe essere il comportamento.

che cosa sta succedendo?

Configurazione:

Netbeans 6.9.1 3.0.1 Glassfish JPA 2.0 (EclipseLink) EJB 3.1

Grazie !!!

@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);
}
È stato utile?

Soluzione

  

quindi cerco di chiamare la convalida esplicita e gettare ConstraintViolationException / RuntimeException ed ancora il chiamante ottiene EjbTransactionRolledbackException ...

Fornire il pieno aiuto stacktrace forza. Ad ogni modo, mi chiedo come si sta chiamando il vostro EJB e se siete di moltiplicazione di una transazione, nel qual caso gettando un EJBTransactionRolledbackException è il giusto comportamento in caso di un'eccezione di sistema. Ma il seguente post del blog potrebbe aiutare:

  

vincolo violato, transazione rollback

     

Quando si utilizza la convalida fagiolo su JPA   entità all'interno di un EJB 3 fagioli si   sarebbe in realtà ottenere un   EJBTransactionRolledbackException se   v'è una violazione del vincolo.

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

Questo è tutto ben in base alle   specifica, ma non realmente   informazione interessante. Non lo sai   vuole veramente sapere cosa è successo, è   vogliono sapere cosa è andato storto.

     

Quindi vi consiglio di aggiungere quanto segue a   il vostro 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>
     

In questo modo è possibile accedere direttamente alla   violazioni.

Risorse

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top