获取Spring MVC中JSON表单的绑定错误的详细信息

时间:2014-02-15 04:55:56

标签: java json spring validation spring-mvc

我使用的是Spring MVC 3.2.4。我有一个控制器方法,从HTML表单接收数据。该方法具有以下特征:

@RequestMapping(...)
public String updateProduct(@Valid Product product, BindingResult bindingResult)

在该方法中,我可以获得有关数据绑定(例如,整数字段中的非整数值)和验证(JSR-303)错误的信息通过以下方式:

if (bindingResult.hasErrors()) {
    List<FieldError> errors = bindingResult.getFieldErrors();

    for (FieldError error : errors) {
        System.out.println(error.getObjectName() + " - " + error.getCode());
    }
}

我想更改此方法,以便它可以以JSON格式而不是application/x-www-form-urlencoded接收数据。我在方法签名中添加了@RequestBody注释:

@RequestMapping(...)
public String updateProduct(@Valid @RequestBody Product product, BindingResult bindingResult)

在更新的方法中,我仍然可以以相同的方式获得所有验证错误。但是,数据绑定错误会生成HttpMessageNotReadableException。该异常似乎没有用于访问错误代码和字段/对象名称等属性的属性。此外,该异常阻止了JSR-303验证,并且用户在下一次数据提交之前不会收到任何JSR-303验证消息。

当我实现接收JSON的控制器方法时,如何获取有关数据绑定错误的信息?

更新

我能想到的一个解决方法是将Product类中的所有字段更改为String,然后使用JSR-303验证它们。这样,就不会发生数据绑定错误。但我必须使用适当的数据类型创建Product类的克隆。

2 个答案:

答案 0 :(得分:4)

不要混淆,HttpMessageNotReadableException与验证错误无关。当HttpMessageConverter无法读取HttpInputMessage时,它会被抛出。使用JSON,这可能意味着MappingJackson2HttpMessageConverter。如果在将JSON反序列化为您指定的任何类型的实例时出现问题,它将抛出该异常,在这种情况下为Product。如果JSON格式错误,就会发生这种情况。

您无法在BindingResult中发现这些错误。

答案 1 :(得分:1)

你应该在那里使用@RequestBody。这样,验证错误将抛出MethodArgumenNotValidException,您可以在@ExceptionHandler带注释的方法中处理它,并返回验证错误。一个JSON错误对象。