您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用JSON将嵌套对象发布到Spring MVC控制器

使用JSON将嵌套对象发布到Spring MVC控制器

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

Java 2022/1/1 18:17:40 有650人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶