更新:从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-urlenpred”)格式(即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 );
如果有人对这个过程有任何改进的建议,我非常高兴。



