使用@RequestBody傳對(duì)象參數(shù)時(shí)碰到的坑
@RequestBody傳對(duì)象參數(shù)時(shí)碰到的坑
工作中需要使用到http接口傳一個(gè)對(duì)象數(shù)組,網(wǎng)上找到某博客:springmvc參數(shù)為對(duì)象,數(shù)組
但是測(cè)試還是不對(duì),報(bào)錯(cuò):
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"}]}')
看樣子好像時(shí)說(shuō)少了string參數(shù)的構(gòu)造函數(shù),試過(guò)很多其他辦法還不行后,決定試一下增加一個(gè)String類型的構(gòu)造方法,代碼如下:
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的官方文檔提到,這個(gè)是默認(rèn)已經(jīng)加載的了,所以最后spring的配置這部分我又刪了,測(cè)試OK。
上面是測(cè)試代碼,測(cè)試代碼測(cè)通后,我的代碼還是報(bào)錯(cuò)
我的真實(shí)代碼是這樣的:
@RequestMapping("/addReportDo")
@ResponseBody
public String addReportDo(String title,String note,@RequestBodyList<Goods> goodsList){
System.out.println(report);
return "ok";
}
//錯(cuò)誤代碼
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
大概意思是不能從這個(gè)String轉(zhuǎn)到List,也就是list對(duì)應(yīng)jsonArray格式不對(duì),使用對(duì)象像上面一樣封裝起來(lái)Report就OK了。
也就是下面的區(qū)別:
{goodsList: [{
goodsNumber: "001",
goodsName: "商品A"
},{
goodsNumber: "002",
goodsName: "商品B"
}]
}
{[{
goodsNumber: "001",
goodsName: "商品A"
},{
goodsNumber: "002",
goodsName: "商品B"
}]
}
由于時(shí)間原因,只是記錄一下現(xiàn)象和解決方案,具體原因還沒有細(xì)看springMVC里的json處理是怎么進(jìn)行的。
@RequestBody 的正確使用
@RequestBody接收的是一個(gè)Json對(duì)象
一直在調(diào)試代碼都沒有成功,后來(lái)發(fā)現(xiàn),其實(shí) @RequestBody接收的是一個(gè)Json對(duì)象的字符串,而不是一個(gè)Json對(duì)象。然而在ajax請(qǐng)求往往傳的都是Json對(duì)象,后來(lái)發(fā)現(xiàn)用 JSON.stringify(data)的方式就能將對(duì)象變成字符串。
同時(shí)ajax請(qǐng)求的時(shí)候也要指定dataType: "json",contentType:"application/json" 這樣就可以輕易的將一個(gè)對(duì)象或者List傳到Java端,使用@RequestBody即可綁定對(duì)象或者List.
@RequestBody的使用
需要加載MappingJackson2HttpMessageConverter,但是SpringBoot的官方文檔提到,這個(gè)是默認(rèn)已經(jīng)加載的了,而且json字符串和javabean也沒有書寫的錯(cuò)誤
直接通過(guò)瀏覽器輸入url時(shí),@RequestBody獲取不到j(luò)son對(duì)象,需要用java編程或者基于ajax的方法請(qǐng)求,將Content-Type設(shè)置為application/json
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java RPC框架如何實(shí)現(xiàn)客戶端限流配置
這篇文章主要介紹了Java RPC框架如何實(shí)現(xiàn)客戶端限流配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
使用Java代碼來(lái)比較Android客戶端版本號(hào)
這篇文章主要介紹了使用Java代碼來(lái)比較Android客戶端版本號(hào),Java是目前安卓程序唯一的開發(fā)語(yǔ)言,需要的朋友可以參考下2015-07-07
SpringBoot使用Thymeleaf模板引擎訪問(wèn)靜態(tài)html的過(guò)程
這篇文章主要介紹了SpringBoot使用Thymeleaf模板引擎訪問(wèn)靜態(tài)html的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Java使用IO流實(shí)現(xiàn)音頻的剪切和拼接
這篇文章主要為大家詳細(xì)介紹了Java使用IO流實(shí)現(xiàn)音頻的剪切和拼接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
淺談Sharding-JDBC強(qiáng)制路由案例實(shí)戰(zhàn)
本文主要介紹了淺談Sharding-JDBC強(qiáng)制路由案例實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Spring?Boot整合Log4j2.xml的問(wèn)題及解決方法
這篇文章主要介紹了Spring?Boot整合Log4j2.xml的問(wèn)題,本文給大家分享解決方案,需要的朋友可以參考下2023-09-09

