Perché bean di sessione metodo tiro EjbTransactionRolledbackException quando RuntimeException è stato gettato
-
05-10-2019 - |
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);
}
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
- L'EJB e applicazione vs un'eccezione di sistema:
- Bean Validation