2010-05-06 50 views
2

我在我的Spring MVC应用程序中实现了一个ReloadableResourceBundleMessageSource,我使用该应用程序为绑定异常显示更漂亮的错误消息。我遇到的问题是,由于公司政策,这些错误必须以以下格式显示:用Spring typeMasmatch错误获取无效的用户输入

[inputData]不是有效的[fieldName]。

默认情况下,我的邮件属性文件(作为{0}参数)可以访问字段名称,但我找不到一种方法来显示无效的用户输入。这可能吗?

回答

1

是,

错误标记不会让你得到你的用户提供的“价值” - 参见link

假设在这里不用你errors.properties(类路径的根)文件(请注意,我是只使用一个{0}参数)

// errors.properties 

error.invalid=is not a valid {0} 

当确认您的命令对象,你做如下

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"); 
     */ 

} 

UPDATE

但要获得你的目标,你必须提供自定义为messageSource(注意器具代替延伸

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); 
    } 

} 

所以定义PolicyMessageSource如为messageSource

<bean id="messageSource" class="br.com.spring.PolicyMessageSource"/> 

请注意,您必须定义只有一个 messageSource实例调用messageSource。请注意,我正在使用ResourceBundleMessageSource。使用ReloadableResourceBundleMessageSource时,您必须检查相同的方法。记住这一点。

+0

不幸的是,如上所述,似乎无法扩展ResourceBundleMessageSource(或类似的ReloadableResourceBundleMessageSource)。原因是AbstractMessageSource中的getMessage()方法是最终的。 – TimmyJ 2010-05-10 18:25:21

+0

@TimmyJ好的,蒂米我会告诉你如何才能得到你的目标 – 2010-05-10 19:21:45

+0

工作很好,谢谢! – TimmyJ 2010-05-10 20:15:21