获取带有Spring类型不匹配错误的无效用户输入

获取带有Spring类型不匹配错误的无效用户输入,spring,data-binding,spring-mvc,customization,Spring,Data Binding,Spring Mvc,Customization,我在我的SpringMVC应用程序中实现了一个ReloadableResourceBundleMessageSource,用于显示绑定异常的更漂亮的错误消息。我遇到的问题是,根据公司政策,这些错误必须以以下格式显示: [inputData]不是有效的[fieldName] 默认情况下,在我的消息属性文件中可以访问字段名(作为{0}参数),但我无法找到显示无效用户输入的方法。这可能吗?是的 错误标记不允许您获取用户提供的“值”-请参阅 假设这里是errors.properties(类路径的根)文件

我在我的SpringMVC应用程序中实现了一个ReloadableResourceBundleMessageSource,用于显示绑定异常的更漂亮的错误消息。我遇到的问题是,根据公司政策,这些错误必须以以下格式显示:

[inputData]不是有效的[fieldName]

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

是的

错误标记不允许您获取用户提供的“值”-请参阅

假设这里是errors.properties(类路径的根)文件(注意,我只使用了一个{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");
      */

}
更新

但要实现目标,您必须提供一个自定义消息源(注意实现而不是扩展)

因此,将您的PolicyMessageSource定义为messageSource

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


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

不幸的是,似乎无法像您上面描述的那样扩展ResourceBundleMessageSource(或类似的可重新加载的ResourceBundleMessageSource)。原因是AbstractMessageSource中的getMessage()方法是最终的。
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);
    }

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