2015-07-14 6 views
1

Comment procéder pour générer un modèle de message par défaut pour une contrainte (dans une entité JPA) si aucun modèle de message n'est déjà défini dans l'annotation elle-même.Génération du modèle de message de contrainte par défaut avec validation du bean

Voici ce que je veux dire. Supposons que j'ai une entité JPA 'Dummy':

@Entity 
public class Dummy { 
    @Column 
    @NotNull 
    Long id; 
} 

De plus, supposons que j'ai un fichier contenant ValidationMessages.properties:

Dummy.id.NotNull=ID of dummy should not be null 

Maintenant, si je définissais la contrainte de @NotNull comme @NotNull (un message = {Dummy.id.NotNull}) tout irait bien, mais que se passe-t-il si je voulais générer le template '{Dummy.id.NotNull}' à la volée (en utilisant la réflexion) pour ne pas avoir à écrire le même modèle standardisé sur chaque contrainte? J'ai essayé ceci en utilisant la classe MessageInterpolator, mais la méthode d'interpolation est appelée seulement quand l'attribut de message est défini, et ceci défait le but de ce que j'essaye de faire. Donc, pour être plus clair, comment faire pour que le validateur demande une partie de mon code "hey, quel est le message pour la contrainte 'NotNull' sur le champ 'id' dans la classe 'Dummy' même s'il n'a pas de message attribué (ou plutôt, il a le message par défaut attribué)? "

Répondre

1

J'avais tort - MessageInterpolator est appelé même si aucun message explicite n'a été défini sur l'annotation. Cela répond à peu près à ma question. La seule chose qui reste est de savoir comment obtenir le nom du champ en cours de validation.

EDIT:

En fin de compte, je suis obligé de mettre en œuvre une classe MessageInterpolator pour chaque champ passant le nom du champ dans le constructeur et la création d'un validateur avec cette MessageInterpolator lorsqu'un champ est beeing validé. Je ne trouve pas cela satisfaisant, mais c'était la seule solution que je pouvais trouver.

Sur cette note, je trouve amusant qu'il n'y ait aucun moyen de retracer l'élément annoté (que ce soit Field, Method, Class ou Parameter) lorsque vous avez accès à l'annotation instance. Si cela était possible, je serais en mesure d'obtenir le nom de domaine dynamiquement, mais cela semble être un "manque" de Java, donc rien ne peut être fait.