Spring MVC Hibernate Validator TypeMismatch异常

3

我正在使用Spring MVC和Hibernate验证器4.2.0。在我的类路径/WEB-INF/classes/ValidationMessages.properties中有一个ValidationMessages.properties:

typeMismatch.java.lang.Integer=Must specify an integer value.
typeMismatch.int=Invalid number entered
typeMismatch=Invalid type entered

这可以在Java配置中作为一个bean提供:

@Configuration
@EnableWebMvc
public class WebApplicationConfiguration extends WebMvcConfigurerAdapter {
...

@Bean
public ReloadableResourceBundleMessageSource messageSource() {
    ReloadableResourceBundleMessageSource resourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
    resourceBundleMessageSource.setBasename("ValidationMessages");
    return resourceBundleMessageSource;
}
...

它可以很好地从类路径加载ValidationMessages.properties。我的控制器:

@Controller
public class myController {
...

@InitBinder("myForm")
protected void initUserBinder(WebDataBinder binder) {
    binder.setValidator(new CustomValidator());
}
...

@ResponseBody
@RequestMapping(value = "/ajax/myRequest", method = RequestMethod.POST)
public CustomResponse ProcessAjaxRequest(
        @Valid @ModelAttribute final MyForm myForm,
        final BindingResult bindingResult)
                throws Exception {

    if (bindingResult.hasErrors()) {
        return new CustomResponse(bindingResult.getAllErrors());
    } else {
        ..
    }
}
...

还有一个自定义验证器:

public class CustomValidator implements Validator {

@Override
public boolean supports(Class c) {
    return MyForm.class.equals(c);
}

@Override
public void validate(Object obj, Errors errors) {
..

我的CustomValidator验证工作正常(我手动插入错误消息,不使用消息源),但是在绑定类型不匹配的错误时,我会得到以下异常:

Failed to convert property value of type 'java.lang.String' to required type 'java.lang.Integer' for property 'myField'; nested exception is java.lang.NumberFormatException: For input string: "A"

看起来 DataBinder (?) 没有使用我的 messageSource,而是使用了 ValidationMessages.properties 中的代码。我希望从我的属性文件中获取 typeMismatch 代码,而不是异常消息。我也尝试过使用 ResourceBundleMessageSource 替代 ReloadableResourceBundleMessageSource,但没有任何区别。有什么想法吗?

1个回答

1
你如何获取错误信息?这对你有效吗?
@Autowired
private MessageSource messageSource;
...

FieldError error = bindingResult.getFieldError("fieldName");
String errorMessage = messageSource.getMessage(error, Locale.getDefault());

我正在使用构造函数注入而不是Autowired,但我遇到了以下问题:无法将类型为java.lang.String的属性值转换为所需的类型java.lang.Integer,属性名为fieldName;嵌套异常是java.lang.NumberFormatException:对于输入字符串:“A” - JimJay
似乎是我的bean定义出了问题? - JimJay
你的bean定义看起来很好。你是否使用getDefaultMessage()方法获取错误消息? - Shinichi Kai
如果您使用getDefaultMessage(),则无法获取自定义的错误消息。似乎Spring默认实现(DefaultBindingErrorProcessor)在将默认错误消息设置为BindingResult对象时未使用MessageSource。 - Shinichi Kai
是的,这就是原因 - DefaultBindingErrorProcessor在设置绑定错误的错误消息时不使用MessageSource。因此我创建了自己的自定义DefaultBindingErrorProcessor,并在控制器中设置了WebDataBinder.setBindingErrorProcessor。 - JimJay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接