2010-05-06 4 views
2

Je l'ai mis en place un ReloadableResourceBundleMessageSource dans mon application Spring MVC que j'utilise pour afficher des messages d'erreur plus jolie des exceptions obligatoires. Le problème que je vais avoir est que, en raison d'une politique de l'entreprise, ces erreurs doivent être affichées dans le format suivant:entrée utilisateur Get invalide avec une erreur de typeMismatch Spring

[donnéesEntrée] n'est pas valide [fieldName].

Le nom du champ est accessible par défaut dans mes propriétés du message fichier (comme {0} argument), mais je ne peux pas trouver un moyen pour afficher l'entrée d'utilisateur non valide. Est-ce possible?

Répondre

1

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.

+0

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

+0

@TimmyJ ok, Timmy je vais vous montrer comment vous pouvez obtenir votre objectif –

+0

a bien fonctionné, merci! – TimmyJ

Questions connexes