Oui,
erreurs Tag ne vous permet pas la « valeur » fournie par votre utilisateur - Voir link
On suppose ici va votre errors.properties (racine du classpath) fichier (Remarquez que je suis en utilisant un seul {0} arguments)
// errors.properties
error.invalid=is not a valid {0}
Lors de la validation de votre objet de commande, vous procédez comme suit
import static org.springframework.validation.ValidationUtils.*;
public boolean validate(Object command, Errors errors) {
Person person = (Person) command;
/**
* new Object [] plays the role of the supplied arguments
*/
rejectIfEmpty(errors, "age", "error.invalid", new Object[] {"Age"}, "Age is required");
/**
* If your label is a resource bundle key, use DefaultMessageSourceResolvable instead
*
* rejectIfEmpty(errors, "age", "error.invalid", new Object[] {new DefaultMessageSourceResolvable("person.age")}, "Age is required");
*/
}
MISE À JOUR
Mais pour obtenir votre objectif, vous doit fournir un MessageSource personnalisé (Remarquemet en œuvre au lieu de étend)
public class PolicyMessageSource implements MessageSource {
private ResourceBundleMessageSource resourceBundle;
public PolicyMessageSource() {
resourceBundle = new ResourceBundleMessageSource();
/**
* Suppose your resource bundle is called messages.properties (root of the classpath)
*/
resourceBundle.setBasenames(new String[] {"messages"});
}
public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
return resourceBundle.getMessage(code, args, defaultMessage, locale);
}
public String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException {
return resourceBundle.getMessage(code, args, locale);
}
public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
if(resolvable instanceof FieldError) {
FieldError fieldError = (FieldError) resolvable;
/**
* Here goes what you want
*/
return fieldError.getRejectedValue() + resourceBundle.getMessage(resolvable, locale);
}
return resourceBundle.getMessage(resolvable, locale);
}
}
définissent donc votre PolicyMessageSource comme MessageSource
<bean id="messageSource" class="br.com.spring.PolicyMessageSource"/>
Sachez que vous devez définir une seule instance de messageSource appelée messageSource. Notez que j'utilise ResourceBundleMessageSource à la place. Vous devez vérifier la même approche lors de l'utilisation de ReloadableResourceBundleMessageSource. Garde ça en tête.
Malheureusement, il semble qu'il ne soit pas possible d'étendre ResourceBundleMessageSource (ou de manière similaire ReloadableResourceBundleMessageSource) comme décrit ci-dessus. La raison en est que les méthodes getMessage() dans AbstractMessageSource sont finales. – TimmyJ
@TimmyJ ok, Timmy je vais vous montrer comment vous pouvez obtenir votre objectif –
a bien fonctionné, merci! – TimmyJ