亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

這是為什么呢?這是因為在HTTPMessageConverter中對應寫json格式相應的處理類在寫json的時候默認是對String類型進行這樣處理的。

以Gson為例

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

他對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);
?? ??? ?}
?? ?}

因為Gson默認對String類型的對象轉化為json就是會加上雙引號的,所以導致了String類型的返回不再是json串了。

如果想要String類型也轉為正常的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) {
? ? ? ? ? ? ? ? //對于String類型的,直接拼接,不轉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);
?? ??? ?}
?? ?}

對于FastJson,在測試的時候發(fā)現(xiàn),對于低版本的FastJson,會存在一個問題,就是當Java對象并沒有默認的構造器的時候,是會報錯的,需要使用新版本的FastJson才會去尋找合適的構造器去實例化對象。

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

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

對了,如果你使用的是fastjson提供的HTTPMessageConverter,是一樣會對String格式做加引號處理的,具體可以看相應源碼。

心得

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

response.body().string()的坑坑坑?。?!

一不小心 浪費了2個小時 

response.body().string()

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

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

總結

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

相關文章

  • Java實現(xiàn)WORD和PDF互相轉換以及數(shù)據(jù)填充示例

    Java實現(xiàn)WORD和PDF互相轉換以及數(shù)據(jù)填充示例

    本文介紹了如何使用Java實現(xiàn)WORD和PDF的互轉以及數(shù)據(jù)填充功能,通過導入Aspose庫并使用其工具類,可以輕松實現(xiàn)WORD和PDF模板的填充和轉換,需要的朋友可以參考下
    2025-02-02
  • XML操作類庫XStream使用詳解

    XML操作類庫XStream使用詳解

    這篇文章主要給大家介紹了關于XML操作類庫XStream使用的相關資料,需要的朋友可以參考下
    2023-11-11
  • Java不可變類機制淺析

    Java不可變類機制淺析

    所謂的不可變類是指這個類的實例一旦創(chuàng)建完成后,就不能改變其成員變量值。如JDK內(nèi)部自帶的很多不可變類:Interger、Long和String等。接下來通過本文給大家介紹Java不可變類機制,需要的朋友參考下
    2017-02-02
  • SpringBoot利用自定義注解實現(xiàn)多數(shù)據(jù)源

    SpringBoot利用自定義注解實現(xiàn)多數(shù)據(jù)源

    這篇文章主要為大家詳細介紹了SpringBoot如何利用自定義注解實現(xiàn)多數(shù)據(jù)源效果,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以了解一下
    2022-10-10
  • java版微信公眾平臺消息接口應用示例

    java版微信公眾平臺消息接口應用示例

    這篇文章主要介紹了java版微信公眾平臺消息接口應用,結合實例形式對比分析了PHP與java應用微信公眾平臺接口的相關調(diào)用與操作技巧,需要的朋友可以參考下
    2017-07-07
  • java中如何調(diào)用js

    java中如何調(diào)用js

    Nashorn是Java8中引入的一個新的JavaScript引擎,它允許在JVM上運行JavaScript代碼,并且可以與Java代碼相互調(diào)用,Nashorn遵循JSR233規(guī)范,是一個純Java實現(xiàn)的JavaScript引擎,可以與Java程序無縫集成,提供動態(tài)腳本執(zhí)行和靈活性
    2025-01-01
  • 使用Java設置字型和顏色的方法詳解

    使用Java設置字型和顏色的方法詳解

    這篇文章主要介紹了使用Java設置字型和顏色的方法,在Java的繪圖等圖形化編程中較常用到,需要的朋友可以參考下
    2015-10-10
  • java獲取手機已安裝APK的簽名摘要

    java獲取手機已安裝APK的簽名摘要

    這篇文章主要介紹了java獲取手機已安裝APK的簽名摘要的相關資料,需要的朋友可以參考下
    2016-02-02
  • 使用springboot在工具類中讀取配置文件(ClassPathResource)

    使用springboot在工具類中讀取配置文件(ClassPathResource)

    這篇文章主要介紹了使用springboot在工具類中讀取配置文件(ClassPathResource),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java yield()線程讓步實現(xiàn)過程解析

    Java yield()線程讓步實現(xiàn)過程解析

    這篇文章主要介紹了Java yield()線程讓步實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03

最新評論