Question

J'utilise Hibernate Validator dans une application avec EJB et Spring MVC. J'utilise JBoss 5, Hibernate 3 et la version Spring MVC 3.

Je voudrais essayer d'attraper des exceptions de validation au printemps Exception niveau résolveur et générer un message d'erreur sur la base du message InvalidStateException. Je ne veux pas mettre la logique de gestion des exceptions dans la couche d'accès aux données; Je veux que cela soit conduit par des annotations et juste gérer les erreurs de validation dans un endroit centralisé.

Le modèle de domaine est correctement vérifié et une exception de type InvalidStateException est jeté comme prévu lorsque je tente de créer une entité non valide (par exemple une contrainte de violer la longueur sur un champ). Au point d'essayer d'attraper l'exception dans mon cas d'un résolveur d'exception Spring, je trouve mon exception d'origine a disparu et un javax.ejb.EJBTransactionRolledbackException a pris sa place. L'exception d'origine est pas dans la liste causée par.

Ma première hypothèse était que org.hibernate.validator.InvalidStateException n'a pas été annotées avec ApplicationException, donc j'installé un écouteur d'événement Hibernate, a attiré l'exception d'origine et rethrew comme une nouvelle exception annotée avec ApplicationException. Cela n'a aucun effet.

Une complexité supplémentaire est que le niveau Web appelle via une interface EJBs à distance. J'annotés ma classe d'exception avec WebFault, mais en vain.

Que dois-je faire pour assurer l'exception des bulles sur toute la hauteur?

Était-ce utile?

La solution

Essayez ceci?

protected InvalidStateException extractValidationException(Throwable ex) { Throwable e = ex; while (e != null) { if (e instanceof InvalidStateException) { return (ValidationException) e; } else if (e instanceof EJBException) { e = ((EJBException) e).getCausedByException(); } else { e = e.getCause(); } } return null; }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top