Catch PersistenceException ou ConstraintViolationException dans JBoss as 7
Je suis dans le processus de migration de JBoss as 6 de JBoss as 7 et ont de la difficulté avec mes tests. Supposons un simple EJB entity:
@Entity public class MyTest implements Serializable
{
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@NotNull
private String headline;
} //getter/setter
Dans mon @Stateless Bean
je suis en train de faire quelque chose comme ceci (comme avant avec JBoss5 et JBoss6):
@Inject private EntityManager em;
public <T extends Object> T persist(T o) throws MyContraintViolationException
{
System.out.println("***************** persist:");
try
{
em.persist(o);
}
catch (Exception e)
{
System.out.println("*************** exception:");
//Further investigation of Exception e,
//then throw MyContraintViolationException
}
}
Cela fonctionne bien si je ne viole pas le @NotNull
contrainte. Si headline==null
, je reçois des exceptions, mais ne pas entrer dans mon catch
bloc:
12:19:45 INFO ******************** persist:
12:19:45 WARN [com.arjuna.ats.arjuna] (management-handler-threads - 2)
ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for
SynchronizationImple< 0:ffffc0a801fb:4f969a6e:4f058744:9,
org.hibernate.engine.transaction.synchronization.internal.
RegisteredSynchronization@38eb9b73 >: javax.persistence.PersistenceException:
error during managed flush
...
Caused by: javax.validation.ConstraintViolationException: Validation failed for
classes [my.test.MyTest] during persist time for groups
[javax.validation.groups.Default, ] List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='kann nicht null sein',
propertyPath=headline, rootBeanClass=class my.test.MyTest,
messageTemplate='{javax.validation.constraints.NotNull.message}'}
Je suis heureux de voir que le message d'erreur est beaucoup plus détaillé que dans les versions précédentes de JBoss, mais comment puis-je attraper un javax.validation.ConstraintViolationException
et de lancer ma propre MyContraintViolationException
? Même le message de débogage ***** exception
est pas imprimé.
OriginalL'auteur Thor | 2012-01-05
Vous devez vous connecter pour publier un commentaire.
Si vous lisez le message et la trace de la pile de l'exception, vous verrez que cette exception n'est pas générée par l'appel à persister, mais par la chasse d'eau:
persistent à ne pas émettre une requête et ne pas sauver quoi que ce soit à la base de données. Elle demande simplement le gestionnaire de l'entité pour faire un transitoire de l'entité persistante. Le flush (c'est à dire juste avant la validation de la transaction, ou avant d'Hibernate exécute une requête qui pourraient avoir besoin de cette entité dans la base de données de renvoyer les résultats corrects, ou lorsque
flush()
est explicitement appelé), puis les contraintes sont vérifiées et les insérer la requête est exécutée.Vous pourriez appeler flush explicitement, mais il aurait une incidence sur les performances de l'application en ne laissant pas d'Hibernation pour lot de plusieurs requêtes et de les exécuter uniquement lorsque c'est nécessaire. Je voudrais juste utiliser le natif d'exception. Pourquoi avez-vous besoin d'une telle conversion?
OriginalL'auteur JB Nizet
Vous utilisez un EJB pour contenir votre entityManager. Chaque appel de méthode d'un EJB Stateless est enveloppé dans une transaction.
Vous avez injecté l'EntityManager. Cela signifie que l'EntityManager fera partie de votre transaction. L'entityManager est seulement vidé lors de la validation des transactions, qui est pourquoi vous ne serez pas en voyant ce message d'erreur.
Ce que vous devez faire est la suivante:
OriginalL'auteur parasietje