这篇文章主要介绍“java使用@RequestBody传对象参数时会碰到什么问题”,在日常操作中,相信很多人在java使用@RequestBody传对象参数时会碰到什么问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java使用@RequestBody传对象参数时会碰到什么问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
@RequestBody传对象参数时碰到的坑
我的真实代码是这样的:
也就是下面的区别:
@RequestBody 的正确使用
@RequestBody接收的是一个Json对象
@RequestBody的使用
工作中需要使用到http接口传一个对象数组,网上找到某博客:springmvc参数为对象,数组
但是测试还是不对,报错:
2019-02-21 23:44:37.168 WARN 34133 --- [nio-7001-exec-6]
.w.s.m.s.DefaultHandlerExceptionResolver :
Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException:
JSON parse error:
Can not construct instance of com.cainiao.cngdm.domain.common.Report: no String-argument constructor/factory method to deserialize from String value ('{"title":"11","note":"22","goodsList":[{"goodsNumber":"001","goodsName":"商品A"},{"goodsNumber":"002","goodsName":"商品B"}]}'); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.cainiao.cngdm.domain.common.Report: no String-argument constructor/factory method to deserialize from String value ('{"title":"11","note":"22","goodsList":[{"goodsNumber":"001","goodsName":"商品A"},{"goodsNumber":"002","goodsName":"商品B"}]}')
看样子好像时说少了string参数的构造函数,试过很多其他办法还不行后,决定试一下增加一个String类型的构造方法,代码如下:
public class Report implements Serializable { private static final long serialVersionUID = 1L; String title; String note; List<Goods> goodsList; Report(){} Report(String dd) { Report report = JSON.parseObject(dd,Report.class); this.title=report.title; this.note=report.title; this.goodsList=report.goodsList; } //getter... setter... }
public class Goods implements Serializable { private static final long serialVersionUID = 1L; String goodsNumber; String goodsName; //getter... setter... }
PS:@RequestBody的使用需要加载MappingJackson2HttpMessageConverter,但是SpringBoot的官方文档提到,这个是默认已经加载的了,所以最后spring的配置这部分我又删了,测试OK。
上面是测试代码,测试代码测通后,我的代码还是报错
@RequestMapping("/addReportDo") @ResponseBody public String addReportDo(String title,String note,@RequestBodyList<Goods> goodsList){ System.out.println(report); return "ok"; }
//错误代码
2019-02-22 12:05:28.498 WARN 36431 --- [nio-7001-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message:
org.springframework.http.converter.HttpMessageNotReadableException:
JSON parse error: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token;
nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token
大概意思是不能从这个String转到List,也就是list对应jsonArray格式不对,使用对象像上面一样封装起来Report就OK了。
{goodsList: [{ goodsNumber: "001", goodsName: "商品A" },{ goodsNumber: "002", goodsName: "商品B" }] }
{[{ goodsNumber: "001", goodsName: "商品A" },{ goodsNumber: "002", goodsName: "商品B" }] }
由于时间原因,只是记录一下现象和解决方案,具体原因还没有细看springMVC里的json处理是怎么进行的。
一直在调试代码都没有成功,后来发现,其实 @RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。然而在ajax请求往往传的都是Json对象,后来发现用 JSON.stringify(data)的方式就能将对象变成字符串。
同时ajax请求的时候也要指定dataType: "json",contentType:"application/json" 这样就可以轻易的将一个对象或者List传到Java端,使用@RequestBody即可绑定对象或者List.
需要加载MappingJackson2HttpMessageConverter,但是SpringBoot的官方文档提到,这个是默认已经加载的了,而且json字符串和javabean也没有书写的错误
直接通过浏览器输入url时,@RequestBody获取不到json对象,需要用java编程或者基于ajax的方法请求,将Content-Type设置为application/json
到此,关于“java使用@RequestBody传对象参数时会碰到什么问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。