我使用的是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
类的克隆。
答案 0 :(得分:4)
不要混淆,HttpMessageNotReadableException
与验证错误无关。当HttpMessageConverter
无法读取HttpInputMessage
时,它会被抛出。使用JSON,这可能意味着MappingJackson2HttpMessageConverter
。如果在将JSON反序列化为您指定的任何类型的实例时出现问题,它将抛出该异常,在这种情况下为Product
。如果JSON格式错误,就会发生这种情况。
您无法在BindingResult
中发现这些错误。
答案 1 :(得分:1)
你应该在那里使用@RequestBody。这样,验证错误将抛出MethodArgumenNotValidException,您可以在@ExceptionHandler带注释的方法中处理它,并返回验证错误。一个JSON错误对象。