栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用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-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 );

如果有人对这个过程有任何改进的建议,我非常高兴。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/383484.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号