J'essaie d'obtenir une configuration de validateur Hibernate pour utiliser des messages d'une messagerie de printemps. J'ai la configuration suivante dans mon J'ai essayé une variété d'approches pour passer la touche de message du validateur Hibernate (à la fois avec et sans enfermer {} et aussi sans spécification d'une clé personnalisée - à l'aide de la valeur par défaut: p> mon Cependant, lorsque les champs vides sont validés, les messages affichés sont ceci: p> pour une raison quelconque , la clé du message est toujours utilisée - le message réel n'est jamais levé. N'importe quelle idée où je vais mal? P> Merci, P> Russell P> p> messages-context.xml code>:
validation_errors_en_gb.properties code> ressemble à Ceci: p>
6 Réponses :
Validator Hibernate regrette dans un endroit différent pour les paramètres régionaux. Essayez ceci: p>
localecontextholder.setlocale (locale); p>
Définissez-le où? Dans la méthode du contrôleur? J'ai donné ça aller mais ça n'avait eu aucun effet, malheureusement. Merci pour la suggestion cependant.
Cela m'avait soulevé pendant un moment, mais le problème est que vous devez vous inscrire au printemps, le validateur utilisé pour valider les méthodes de contrôle @Controller (grâce à Cette réponse pour cette perspective!)
Donc, si vous utilisez XML config, faites quelque chose sur ces lignes: P>
@EnableWebMVC @Configuration public MyWebAppContext extends WebMvcConfigurerAdapter { @Bean public LocalValidatorFactoryBean validator() { LocalValidatorFactoryBean validatorFactoryBean = new LocalValidatorFactoryBean(); validatorFactoryBean.setValidationMessageSource(messageSource); return validatorFactoryBean; } @Override public Validator getValidator() { return validator(); }
Merci pour votre réponse - je l'ai prévu plutôt que de l'accepter, comme après avoir posté cette question, j'ai quitté Java, donc je n'ai plus la configuration requise pour le tester. Il "regarde" comme une bonne réponse, alors quand je reçois le temps de le tester, je le ferai, puis acceptez-le.
En fait, je pourrais prendre cela - quelle est la différence entre votre suggestion et ce qui est déjà dans mon messages-context.xml code>?
Parce que vous devez expliquer explicitement le printemps que le bean de validateur à utiliser pour la validation MVC. Juste avoir un validateur flottant dans le contexte de l'application ne suffit pas.
C'est parce que Validator Hibernate examine un autre endroit pour le résolveur du message d'erreur. P>
Pour la chose la plus facile à faire fonctionne, je pense que vous pouvez créer un nom de fichier " Au fait, les supports sont nécessaires lors de la spécification des messages d'erreur dans les classes de modèle ( validationmessages.properties code>" et mettez-le dans votre dossier de classe. Ensuite, mettez les messages d'erreur dans ce fichier (obtenu à partir de
validation_errors_en_gb.properties code>) p>
message = "{validation.too.long}" code>) p>
La validation hibernate n'est pas au courant de la messagerie de printemps. Vous devrez mettre en œuvre un MessagePolorator. Il peut ressembler à quelque chose comme ci-dessous:
public class SpringMessageInterpolator implements MessageInterpolator { private final MessageResource messageResource; private final MessageInterpolator delegate; public SpringMessageInterpolator(MessageResource messageResource, MessageInterpolator delegate) { this.messageResource = messageResource; this.delegate = delegate; } @Override public String interpolate(String messageTemplate, Context context) { Locale locale = Locale.getDefault(); return interpolate(messageTemplate, context, locale); } @Override public String interpolate(String messageTemplate, Context context, Locale locale) { try { Object[] args = {}; return databaseMessageResource.getMessage(messageTemplate, args, locale); } catch (NoSuchMessageException ex) { return delegate.interpolate(messageTemplate, context, locale); } } }
Cela a fonctionné pour moi.
Par défaut Validateur Hibernate Strong> S (ou mieux à dire MessageInterpolator em>) vérifie Dans le domaine du ressort, vous pouvez configurer ces fichiers comme suit (Supposons que les messages sont stockés dans le fichier Remarque: faites attention aux importations mentionnées dans la section Commentaire. p> personnalisévalidationmessages.properties strong> qui détient des messages de validation: validationmessages.properties code> et printemps strong> checks
messages.properties code> pour résoudre les messages de validation.
personnalisévalidationmessages.properties code> fichier et ce fichier est situé dans le répertoire
i18n code>): p>
interpolated: This filed cannot be empty
non interpolated: {required.field.error}
J'utilise: Printemps 3.05, Validateur Hibernate 4.2.0.Finale, Hibernate-Core 3.3.2.ga et hibernate-annotations 3.4.0.ga
J'ai essayé d'utiliser de nouvelles versions de hibernate-core et d'annotations, et je reçois un
java.lang.incompatibleclasschangeError: classe d'implémentation code> lorsque vous essayez de créer la sessionFactory, ce qui me suggère une sorte d'incompatibilité entre les versions - mais de quoi? Des idées?
Tout le monde mentionne comment configurer le printemps pour connaître le validateur Hibernate et la source de messages, le besoin ici est de laisser Hibernate savoir à choisir la source de message Springs au lieu de son propre fichier de validationProperties.