更新:从Spring 3.1开始,可以在@RequestBody控制器方法参数中使用@Valid。
@RequestMapping(value=”/ajax/saveVendor.do”, method = RequestMethod.POST) public @ResponseBody AjaxResponse saveVendor( @Valid @RequestBody UIVendor vendor, BindingResult result, Locale currentLocale ) 经过多次尝试和错误,我终于尽我所能找出问题所在。使用以下控制器方法签名时:
@RequestMapping(value=”/ajax/saveVendor.do”, method = RequestMethod.POST) public @ResponseBody AjaxResponse saveVendor( @Valid UIVendor vendor, BindingResult result, Locale currentLocale ) 客户端脚本必须以后数据(通常为“ application / x-www-form-urlencoded”)格式(即field = value&field2 = value2)传递对象中的字段。这是在jQuery中完成的,如下所示:
$.post( “mycontroller.do”, $.param(object), callback, “json” ) 对于没有子对象或集合的简单POJO对象,这很好用,但是一旦您为传递的对象引入了极大的复杂性,Spring的映射逻辑就无法识别jQuery用于序列化对象数据的符号:
object[0][field] 我解决此问题的方法是将控制器中的方法签名更改为:
@RequestMapping(value=”/ajax/saveVendor.do”, method = RequestMethod.POST) public @ResponseBody AjaxResponse saveVendor( @RequestBody UIVendor vendor, Locale currentLocale ) 并将呼叫从客户端更改为:
$.ajax(
{
url:"ajax/mycontroller.do",
type: "POST",
data: JSON.stringify( objecdt ),
success: callback,
dataType: "json",
contentType: "application/json"
} );
这需要使用JSON javascript库。它还将contentType强制为“ application / json”,这是Spring在使用@RequestBody批注时所期望的,并将对象序列化为Jackson可以反序列化为有效对象结构的格式。
唯一的副作用是,现在我必须在controller方法内部处理自己的对象验证,但这相对简单:
BindingResult result = new BeanPropertyBindingResult( object, “MyObject” ); Validator validator = new MyObjectValidator(); validator.validate( object, result ); 如果有人对这个过程有任何改进的建议,我非常高兴。