欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

使用@RequestBody传对象参数时碰到的坑

时间:2023-01-09 11:47:07|栏目:JAVA代码|点击:

@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 的正确使用

@RequestBody接收的是一个Json对象

一直在调试代码都没有成功,后来发现,其实 @RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。然而在ajax请求往往传的都是Json对象,后来发现用 JSON.stringify(data)的方式就能将对象变成字符串。

同时ajax请求的时候也要指定dataType: "json",contentType:"application/json" 这样就可以轻易的将一个对象或者List传到Java端,使用@RequestBody即可绑定对象或者List.

@RequestBody的使用

需要加载MappingJackson2HttpMessageConverter,但是SpringBoot的官方文档提到,这个是默认已经加载的了,而且json字符串和javabean也没有书写的错误

直接通过浏览器输入url时,@RequestBody获取不到json对象,需要用java编程或者基于ajax的方法请求,将Content-Type设置为application/json

上一篇:解决weblogic部署springboot项目步骤及可能会出现的问题

栏    目:JAVA代码

下一篇:Java中List分片的5种方法小结

本文标题:使用@RequestBody传对象参数时碰到的坑

本文地址:http://www.codeinn.net/misctech/223330.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有