2010-07-30 2 views
2

J'essaie de récupérer un message d'erreur de validation par défaut en utilisant MessageSource. Le code avec lequel je travaille utilise la réflexion pour récupérer la valeur du paramètre message. Sur une contrainte qui ne remplace pas le paramètre message, je souhaite récupérer le message d'erreur par défaut. Lorsque j'appelle la méthode message sur l'annotation de validation, j'obtiens {org.hibernate.validator.constraints.NotBlank.message} (par exemple, pour l'annotation @NotBlank). J'ai ensuite essayé d'utiliser MessageSource pour obtenir le message d'erreur comme ceci:Comment puis-je récupérer les messages de validation par défaut de Hibernate Validator?

String message = messageSource.getMessage(key, null, Locale.US); 

J'ai essayé la mise key-{org.hibernate.validator.constraints.NotBlank.message}, org.hibernate.validator.constraints.NotBlank.message (accolades enlevés) et même org.hibernate.validator.constraints.NotBlank, mais je continue à me null. Qu'est-ce que je fais mal ici?

MISE À JOUR

Une clarification. Je suis sous l'impression que Spring est livré avec un fichier par défaut message.properties pour ses contraintes. Ai-je raison dans cette hypothèse?

MISE À JOUR

Changer le nom de la question afin de mieux refléter ce que je voulais faire.

+0

Il y a certainement des messages générés automatiquement pour certaines violations de contraintes, mais je ne pense pas qu'il soit exprimé comme un fichier 'messages.properties'. – skaffman

+0

@skaffman savez-vous où spring/hibernate-validator reçoit ces messages? –

+0

'fraide pas, non. Je suis assez sûr que c'est Hibernate Validator qui le fait, cependant, pas Spring. – skaffman

Répondre

1

Après l'exécution dans un blog post d'un des gars Hibernate, et après avoir creusé autour de la source Hibernate Validator, je pense que je l'ai pensé à elle:

public String getMessage(Locale locale, String key) { 
    String message = key; 
    key = key.toString().replace("{", "").replace("}", ""); 

    PlatformResourceBundleLocator bundleLocator = new PlatformResourceBundleLocator(ResourceBundleMessageInterpolator.DEFAULT_VALIDATION_MESSAGES); 
    ResourceBundle resourceBundle = bundleLocator.getResourceBundle(locale); 

    try { 
     message = ResourceBundle.getString(key); 
    } 

    catch(MissingResourceException) { 
     message = key; 
    } 

    return message; 
} 

Alors d'abord, vous devez instancier un PlatformResourceBundleLocator avec les messages de validation par défaut. Ensuite, vous récupérez un ResourceBundle à partir du localisateur et l'utilisez pour obtenir votre message. Je ne crois pas que cela effectue une interpolation cependant. Pour cela, vous devez utiliser un interpolateur; l'article de blog que j'ai lié à ci-dessus va dans plus de détails à ce sujet.

MISE À JOUR

Un autre (plus facile) moyen est de mettre à jour votre applicationContext.xml et faire:

<bean id="resourceBundleSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>org.hibernate.validator.ValidationMessages</value> 
     </list> 
    </property> 
</bean> 

Maintenant, votre MessageSource est rempli avec les messages par défaut et vous pouvez le faire messageSource.getMessage(). En fait, c'est probablement le meilleur moyen.

Questions connexes