Comment gérer DataIntegrityViolationException au Printemps?
J'ai besoin d'afficher des messages personnalisés dans mon Printemps 3.0 de l'application. J'ai une base de données avec Hibernate et il y a plusieurs contraintes. J'ai des doutes dans la façon dont DataIntegrityViolationException
doivent être manipulés dans le bon sens. Je me demande si il existe un moyen de la carte de l'exception avec un ensemble de messages dans un fichier de propriétés, comme il est possible dans les Contraintes de validation. Pourrais-je gérer automatiquement en aucune façon, ou je dois prendre cette exception dans chaque contrôleur?
Vous devez vous connecter pour publier un commentaire.
Le problème avec la montre des messages conviviaux dans le cas de violation de contrainte est que le nom de la contrainte est perdu lors de Hibernate
ConstraintViolationException
est en cours de traduction dans le PrintempsDataIntegrityViolationException
.Cependant, vous pouvez personnaliser cette traduction de la logique. Si vous utilisez
LocalSessionFactoryBean
pour accéder à Hibernate, vous pouvez fournir une coutumeSQLExceptionTranslator
(voirLocalSessionFactoryBean.jdbcExceptionTranslator
). Cette exception traducteur peut traduire uneConstraintViolationException
dans votre propre classe d'exception, en préservant le nom de la contrainte.Printemps 3 fournit deux façons de traiter ce -
HandlerExceptionResolver
dans votre beans.xml ou@ExceptionHandler
dans votre contrôleur. Ils font tous les deux la même chose - ils transformer l'exception en vue de rendre.Les deux sont documentés ici.
Je traite
DataIntegrityViolationException
dansExceptionInfoHandler
, trouver DB contraintes occurrences en cause racine de message et de le convertir en i18n message viaconstraintCodeMap
:Peut être simulé dans mon Java Enterprise application formation par l'ajout/modification de l'utilisateur avec une copie du mail ou un repas avec des doublons de dateTime.
Mise à JOUR:
Autre solution: utiliser Contrôleur De Base De La Gestion Des Exceptions:
UK_6DOTKOTT2KJSP8VW4D0M25FB7_INDEX_4
uniqueConstraints
paramètre dans@Table
annotation, par exemple@Table(name = "meals", uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "date_time"}, name = "meals_unique_user_datetime_idx")})