SpringBoot解決返回體content-type非json

TigerJin發表於2021-09-09

最佳解決方案為自定義訊息轉換器。

首先,為什麼要自定義訊息轉換器?所見即所得,原本的訊息轉換器並不能滿足我們目前的需求。

在最近的專案中,使用了SpringBoot與FastJson構建專案,在我們返回時,使用 @ResponseBody的方法裡,採用了fastjson裡的JSON.toJSONString()方法返回我們需要的Json資料,而這種返回中,會有一個問題,在返回中@ResponseBody註解中的訊息轉換器會預設理解為String解析,在返回體中如下圖,content-typetext/html

圖片描述

因此我們解決想讓我們的返回體中content-typeapplication/json

針對於這個問題,有一種最暴力的解決方案,直接在@RequestMapping中新增produces屬性,設定produces="application/json"直接使得返回體設定為json格式。

當然對於這種每個介面暴力解決的方案來說,對於每寫一個介面都需要設定,因此增加我們寫程式碼的重複性工作,因此需要一個一勞永逸的方式。

@ResponseBody裡預設有訊息轉換器,一般json轉換使用的是JackJson進行轉換的,而我們在專案中配置使用fastjson,因此需要修改訊息轉化器。

首先訊息轉化器中不只有json轉換器,還有字元轉換器等。

在我們的專案中可以自定義一個配置類,標註有@Configuration或者在@SpringBootApplication的啟動配置類中新增下面程式碼,就增加了fastjson的訊息轉換器注入。

/**
 * fastjson訊息轉換器
 * @return
 */@Beanpublic HttpMessageConverters httpMessageConverters() {
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();    //新增fastJson的配置資訊
    FastJsonConfig fastJsonConfig = new FastJsonConfig();
    fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);    //處理中文亂碼問題
    List fastMediaTypes = new ArrayList();
    fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);    //在convert中新增配置資訊.   
    fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
    fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
    HttpMessageConverter> converter = fastJsonHttpMessageConverter;        return new HttpMessageConverters(converter);
}

當然需要注意,這種配置的方式必須在fastjson 1.2.44版本及之後才支援。在我們使用Maven構建專案是,需要新增fastjson的依賴。


    com.alibaba
    fastjson
    1.2.44

使用這種配置後,可以在返回中去掉我們的json轉化,並直接返回我們需要轉化的實體,在訊息轉換器中會自動呼叫fastjson進行轉json。

圖片描述

解決後結果



作者:小濁微清
連結:】

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2144/viewspace-2810632/,如需轉載,請註明出處,否則將追究法律責任。

相關文章