Les messages de Validation ne sont pas prises à partir d'un message de fichier de propriétés au Printemps
Je l'ai eu à travailler hier et puis j'ai fait quelque chose et maintenant j'ai essayé de le fixer pendant des heures et je ne peux pas le faire fonctionner.
J'ai un Spring MVC application contenant un <form:form>
que je veux afficher des messages d'erreur personnalisés (<form:errors>
) à partir d'un .fichier de propriétés lorsque l'utilisateur tape dans de fausses informations. Ce "mal", c'est défini dans la JSR-303 annotations.
Extrait de la forme:
<form:form method="post" action="adduserprofile" modelAttribute="bindableUserProfile">
<table>
<tr>
<td><form:label path="firstName">Voornaam</form:label></td>
<td>
<form:input path="firstName"/>
<form:errors path="firstName" />
</td>
</tr>
<tr>
<td><form:label path="lastName">Achternaam</form:label></td>
<td>
<form:input path="lastName"/>
<form:errors path="lastName" />
</td>
</tr>
Extrait de la BindableUserProfile:
@NotNull
@Size(min = 3, max = 40, message="{errors.requiredfield}")
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@NotNull
@Size(min = 3, max = 40, message="errors.requiredfield")
public String getLastName() {
return lastName;
}
Extrait du contrôleur:
@RequestMapping(value = "/edit/{userProfileId}", method = RequestMethod.GET)
public String createOrUpdate(@PathVariable Long userProfileId, Model model) {
if (model.containsAttribute("bindableUserProfile")) {
model.addAttribute("userProfile", model.asMap().get("bindableUserProfile"));
} else {
UserProfile profile = userProfileService.findById(userProfileId);
if (profile != null) {
model.addAttribute(new BindableUserProfile(profile));
} else {
model.addAttribute(new BindableUserProfile());
}
}
model.addAttribute("includeFile", "forms/userprofileform.jsp");
return "main";
}
@RequestMapping(value = "/adduserprofile", method = RequestMethod.POST)
public String addUserProfile(@Valid BindableUserProfile userProfile, BindingResult result, Model model) {
if (result.hasErrors()) {
return createOrUpdate(null, model);
}
UserProfile profile = userProfile.asUserProfile();
userProfileService.addUserProfile(profile);
return "redirect:/userprofile";
}
Extrait de application-context.xml
<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages/messages"/>
</bean>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource">
<ref bean="messageSource"/>
</property>
</bean>
Dans ressources/messages que j'ai deux fichiers, messages_en.propriétés et messages_nl.les propriétés. Les deux ont le même, simple contenu:
errors.requiredfield=This field is required!!!
- Quand je soumettre le formulaire avec un prénom vide je peux voir dans le contrôleur de la méthode 'addUserProfile()' que les erreurs sont en effet retrouvés.
- Quand je soumettre le formulaire avec un vide d'abord le nom de l'identificateur de message s'affiche à côté du champ, c'est le sens littéral du texte "les erreurs.requiredfield" ou "{erreurs.requiredfield}" dans le cas du nom de famille.
- Quand j'ai modifier le message de la valeur de l'attribut "Foo" que "Foo" est montré comme le message d'erreur. Ainsi, le mécanisme d'erreur lui-même semble bien fonctionner.
- La messageSource de la fève de application-context.xml doit être correcte, parce qu'il dit qu'il ne peut pas trouver les fichiers de propriétés lorsque je change le nom de base.
- Le vide d'entrée n'est pas interceptée par le NotNull annotation. Le printemps voit d'entrée vide comme une chaîne vide et non pas comme nulle.
Donc, il semble que les propriétés des fichiers sont trouvés et la validation des annotations sont correctement traitées, mais le Printemps ne veut pas comprendre qu'il doit remplacer les clés de message avec des messages à partir des propriétés des fichiers.
OriginalL'auteur Julius | 2012-07-24
Vous devez vous connecter pour publier un commentaire.
Yaaaargh, je pense que ce n'était pas censé travailler en premier lieu.
J'ai pensé qu'il était possible d'avoir le "message" de l'attribut de la JSR-303 annotations être interprétée comme une clé pour obtenir un message d'erreur associé à partir d'un message.les propriétés de fichier, mais je thinnk je me trompe.
@Size(min = 3, max = 40, message="errors.requiredfield")
Ma collègue au travail programmé une couche qui a créé ce comportement pour nous, mais il ne fonctionne pas par défaut. Il me semblait que si je l'ai eu à travailler une fois, parce que j'ai été en utilisant
@Size(min = 3, max = 40, message="{errors.requiredfield}")
Les accolades causé Printemps pour lancer une rechercher et remplacer une procédure qui utilise .les propriétés des fichiers en tant que source. Cette deuxième option est toujours fonctionné bien.
OriginalL'auteur Julius
J'ai été faire la même chose du passé de 1,5 jours et j'ai enfin trouvé une solution.
Peut-être que c'est un peu fou, mais son une solution de travail. 🙂
Maintenant supprimer
message = "Email size should be between 1 and 50"
à partir de la validation de la balise.Après avoir fait cela, votre annotation sera comme ceci.
Maintenant au contrôleur côté de débogage de la méthode qui est appelée lors de la soumission du formulaire. Ci-dessous est ma méthode qui est la réception de la demande lorsque l'utilisateur clique sur soumettre.
Maintenant, placez un point de débogage à la première ligne de la méthode et de débogage de l'argument "résultat".
Tout dubugging, vous trouverez une chaîne comme celle-ci dans les codes de tableau.
Maintenant de définir cette chaîne dans votre fichier de propriétés et un message à l'encontre de cette chaîne.
La compilation et l'exécution. Ce message sera affiché à chaque fois que cette annotation ne serait pas validé.
Fondamentalement printemps fait sa propre chaîne de clé de son fichier de propriété message. Dans la clé ci-dessus:
Size(@Size)
= validation d'annotation nomloginForm
= mon nom de classeloginId
= nom de la propriété dansloginForm
classe.La beauté de cette méthode est qu'elle fonctionne aussi bien pendant que vous serez à l'aide de Printemps de l'Internationalisation. Il commute automatiquement les messages de fichiers comme les changements de langue.
OriginalL'auteur Shan Arshad