最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決@ResponseBody作用在返回類型為String的方法時(shí)的坑

 更新時(shí)間:2023年06月17日 15:46:16   作者:BryantLmm  
這篇文章主要介紹了解決@ResponseBody作用在返回類型為String的方法時(shí)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

@ResponseBody作用在返回類型為String的方法時(shí)的坑

在默認(rèn)的Spring配置中,當(dāng)在返回類型為String的Controller方法時(shí),在其上加上@ResponseBody時(shí)會(huì)出現(xiàn)問題,那就是返回的不再是我們期待的Json格式的字符串了,而是會(huì)變成在正常的Json串前后加上雙引號(hào)。

這是為什么呢?這是因?yàn)樵贖TTPMessageConverter中對(duì)應(yīng)寫json格式相應(yīng)的處理類在寫json的時(shí)候默認(rèn)是對(duì)String類型進(jìn)行這樣處理的。

以Gson為例

在SpringBoot中,有相應(yīng)的Configuartion來配置用戶來解析Json格式的HttpMessageConverter,經(jīng)過DEBUG發(fā)現(xiàn),在HttpMessageConverter列表中第一個(gè)符合處理json返回格式的是GsonHttpMessageConverter,他是在GsonHttpMessageConvertersConfiguration類中被注入的。

他對(duì)json的處理是

?? ?@Override
?? ?protected void writeInternal(Object o, Type type, HttpOutputMessage outputMessage)
?? ??? ??? ?throws IOException, HttpMessageNotWritableException {
?? ??? ?Charset charset = getCharset(outputMessage.getHeaders());
?? ??? ?OutputStreamWriter writer = new OutputStreamWriter(outputMessage.getBody(), charset);
?? ??? ?try {
?? ??? ??? ?if (this.jsonPrefix != null) {
?? ??? ??? ??? ?writer.append(this.jsonPrefix);
?? ??? ??? ?}
?? ??? ??? ?if (type != null) {
?? ??? ??? ??? ?this.gson.toJson(o, type, writer);
?? ??? ??? ?}
?? ??? ??? ?else {
?? ??? ??? ??? ?this.gson.toJson(o, writer);
?? ??? ??? ?}
?? ??? ??? ?writer.close();
?? ??? ?}
?? ??? ?catch (JsonIOException ex) {
?? ??? ??? ?throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
?? ??? ?}
?? ?}

因?yàn)镚son默認(rèn)對(duì)String類型的對(duì)象轉(zhuǎn)化為json就是會(huì)加上雙引號(hào)的,所以導(dǎo)致了String類型的返回不再是json串了。

如果想要String類型也轉(zhuǎn)為正常的json格式的話,只要重寫GsonHttpMessageConverter即可。

?? ?@Override
?? ?protected void writeInternal(Object o, Type type, HttpOutputMessage outputMessage)
?? ??? ??? ?throws IOException, HttpMessageNotWritableException {
?? ??? ?Charset charset = getCharset(outputMessage.getHeaders());
?? ??? ?OutputStreamWriter writer = new OutputStreamWriter(outputMessage.getBody(), charset);
?? ??? ?try {
?? ??? ??? ?if (this.jsonPrefix != null) {
?? ??? ??? ??? ?writer.append(this.jsonPrefix);
?? ??? ??? ?}
?? ??? ??? ?if (type != null) {
? ? ? ? ? ? ? ? //對(duì)于String類型的,直接拼接,不轉(zhuǎn)json
?? ??? ??? ?if("java.lang.String".equals(type.getTypeName())){
? ? ? ? ? ? ? ? writer.append(value.toString());
?? ??? ??? ?}else{
?? ??? ??? ??? ?this.gson.toJson(o, type, writer);
? ? ? ? ? ? ? ? }
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?else {
?? ??? ??? ??? ?this.gson.toJson(o, writer);
?? ??? ??? ?}
?? ??? ??? ?writer.close();
?? ??? ?}
?? ??? ?catch (JsonIOException ex) {
?? ??? ??? ?throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
?? ??? ?}
?? ?}

對(duì)于FastJson,在測(cè)試的時(shí)候發(fā)現(xiàn),對(duì)于低版本的FastJson,會(huì)存在一個(gè)問題,就是當(dāng)Java對(duì)象并沒有默認(rèn)的構(gòu)造器的時(shí)候,是會(huì)報(bào)錯(cuò)的,需要使用新版本的FastJson才會(huì)去尋找合適的構(gòu)造器去實(shí)例化對(duì)象。

至于哪個(gè)版本才可以稱為新版本,沒有仔細(xì)研究,我使用的1.2.47版本已經(jīng)修復(fù)這個(gè)問題。

Fastjson還是有很多坑的,之前有研究過他之前的一個(gè)遠(yuǎn)程漏洞,這個(gè)后續(xù)會(huì)寫一篇文章,個(gè)人并不建議使用Fastjson,推薦Gson。

對(duì)了,如果你使用的是fastjson提供的HTTPMessageConverter,是一樣會(huì)對(duì)String格式做加引號(hào)處理的,具體可以看相應(yīng)源碼。

心得

所以為了@ResponseBody能良好的實(shí)現(xiàn)返回json格式的功能,要不我們就不要返回String對(duì)象,要么就需要重寫相應(yīng)將返回對(duì)象處理為Json的HTTPMessageConverter,特殊化他對(duì)String類型的處理。

response.body().string()的坑坑坑?。。?/h2>

一不小心 浪費(fèi)了2個(gè)小時(shí) 

response.body().string()

這個(gè)東西明明就看到過是string string為啥還是寫成了toString()...

寫成了response.body().toString()后打印出來的就是okhttp3.internal.http.RealResponseBody@815f248這樣的數(shù)據(jù)?。。?/p>

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA中osgi的開發(fā)應(yīng)用指南詳解

    IDEA中osgi的開發(fā)應(yīng)用指南詳解

    這篇文章主要介紹了IDEA中osgi的開發(fā)應(yīng)用指南詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 實(shí)現(xiàn)分庫(kù)分表功能

    Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 實(shí)現(xiàn)分庫(kù)分表功能

    這篇文章主要介紹了Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 實(shí)現(xiàn)分庫(kù)分表功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • IDEA如何對(duì)單個(gè)的java class文件打成jar包

    IDEA如何對(duì)單個(gè)的java class文件打成jar包

    這篇文章主要介紹了IDEA如何對(duì)單個(gè)的java class文件打成jar包問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Spring源碼完美導(dǎo)入IDEA的過程

    Spring源碼完美導(dǎo)入IDEA的過程

    正值春節(jié)假期,小伙伴私信我idea導(dǎo)入spring源碼的過程,今天抽空給大家整理一篇教程幫助大家學(xué)習(xí)Spring源碼完美導(dǎo)入IDEA的詳細(xì)過程,感興趣的朋友一起看看吧
    2022-02-02
  • MybatisPlus?BaseMapper?實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)增刪改查源碼

    MybatisPlus?BaseMapper?實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)增刪改查源碼

    MybatisPlus?是一款在?Mybatis?基礎(chǔ)上進(jìn)行的增強(qiáng)?orm?框架,可以實(shí)現(xiàn)不寫?sql?就完成數(shù)據(jù)庫(kù)相關(guān)的操作,這篇文章主要介紹了MybatisPlus?BaseMapper?實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)增刪改查源碼解析,需要的朋友可以參考下
    2023-01-01
  • 微服務(wù)分布式架構(gòu)實(shí)現(xiàn)日志鏈路跟蹤的方法

    微服務(wù)分布式架構(gòu)實(shí)現(xiàn)日志鏈路跟蹤的方法

    在現(xiàn)有的系統(tǒng)中,由于大量的其他用戶/其他線程的日志也一起輸出穿行其中導(dǎo)致很難篩選出指定請(qǐng)求的全部相關(guān)日志。那我們?nèi)绾蝸硖幚砟??帶著這個(gè)問題一起通過本文學(xué)習(xí)下吧
    2021-08-08
  • Spring中的構(gòu)造注入

    Spring中的構(gòu)造注入

    這篇文章主要介紹了Spring中的構(gòu)造注入,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java中弱引用和軟引用的區(qū)別以及虛引用和強(qiáng)引用介紹

    Java中弱引用和軟引用的區(qū)別以及虛引用和強(qiáng)引用介紹

    很早Java API就添加了弱引用(WeakReference)和軟引用(SoftReference),但并不是所有的程序員都熟悉這兩個(gè)概念
    2014-04-04
  • Spring計(jì)劃任務(wù)用法實(shí)例詳解

    Spring計(jì)劃任務(wù)用法實(shí)例詳解

    這篇文章主要介紹了Spring計(jì)劃任務(wù)用法,結(jié)合實(shí)例形式詳細(xì)分析了spring計(jì)劃任務(wù)相關(guān)原理、配置、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • 使用Maven進(jìn)行依賴排除的詳細(xì)步驟

    使用Maven進(jìn)行依賴排除的詳細(xì)步驟

    在Maven中,依賴排除是一種常見的技術(shù),用于從項(xiàng)目的依賴中排除特定的傳遞性依賴,這通常用于解決依賴沖突或避免引入不需要的庫(kù),以下是如何在Maven中使用依賴排除的詳細(xì)步驟,包括代碼示例,需要的朋友可以參考下
    2024-11-11

最新評(píng)論

阿合奇县| 福清市| 礼泉县| 安远县| 通城县| 英吉沙县| 收藏| 延吉市| 方山县| 通河县| 民和| 贞丰县| 隆回县| 永年县| 五原县| 芜湖市| 遂平县| 灵武市| 揭阳市| 武功县| 南京市| 化德县| 额济纳旗| 雅江县| 正镶白旗| 澄城县| 望都县| 安远县| 永泰县| 盱眙县| 三明市| 和平县| 泸水县| 西藏| 进贤县| 池州市| 额济纳旗| 措勤县| 辉南县| 桂林市| 樟树市|