這是我的專欄《學透Spring Boot》的第18篇文章,想要更系統的學習Spring Boot,請訪問我的專欄:學透 Spring Boot_postnull咖啡的博客-CSDN博客。
目錄
返回不同格式的響應
Spring Boot的內容協商
控制器不用任何修改
啟動內容協商配置
訪問應用
獲取XML格式的響應
添加XML的支持
設置變量名
配置其它的格式
總結
Spring MVC中會根據@GetMapping或者@RequestMapping中的路徑,匹配對應的HTTP請求到指定的方法去,這個我們不再累述。
今天我們玩點更特別的。
返回不同格式的響應
有時候,我們希望我們的響應,既可以返回json格式,也可以返回xml格式。
返回什么格式,由我們的參數來決定。
最傻的辦法,是在Controller中,解析format參數,然后用XML或者Json解析器把對象轉換成json或者XML格式。
這樣當然可以,但是有點不夠優雅。
Spring Boot的內容協商
好在,Spring Boot已經幫我實現了這樣的特性,支持不同格式的響應。
控制器不用任何修改
控制器不用做任何修改,甚至連format參數都不用加。
啟動內容協商配置
application.properties
spring.mvc.contentnegotiation.favor-parameter=true
訪問應用
然后我們可以帶參數獲取不同的響應。
http://localhost:8080/buyBike?format=json
返回了json響應
不帶format參數,返回的也是json。這是默認格式。
獲取XML格式的響應
然后我們再獲取xml響應:http://localhost:8080/buyBike?format=xml
非常可惜,情況有點異常。報錯了。
查看日志,發現支持的格式中居然沒有application/xml.
這是怎么回事呢?
我們debug看看,啟動時看看WebMvcConfigurer (Spring MVC配置器)加載了哪些http消息轉換器。
要深入了解HTTP消息轉換器,請看我上一篇的文章學透Spring Boot — 017. 魔術師—Http消息轉換器-CSDN博客
可以看到,SpringBoot只配置了json的轉換器。
我們再看看jackson的自動配置類
可以看到,要配置Jackson XML,就classpath下必須有XmlMapper類。
很可惜Spring Boot默認沒有引入這個類。
添加XML的支持
為了支持XML的響應,我們需要引入XML相關的依賴。
這時候有了XmlMapper類,我們的Jackson也會去自動配置XML轉換器了。
我們重啟服務,debug,再看看加載的消息轉換器列表。
下圖可以看出,Jackson XML的消息轉換器已經自動配置并加載了。
再次訪問,成功返回xml的響應!!!
設置變量名
其實我們還可以做得在多一點。比如我不喜歡format這個變量,我想改成good
spring.mvc.contentnegotiation.parameter-name=good
完全OK
配置其它的格式
如果我還想配置其它的格式,也是可以的。比如我們前面文章自主研發的格式“hehe/nba”
spring.mvc.contentnegotiation.media-types.hehe-nbc=hehe/nba
訪問有問題可能是因為你的格式不在支持的列表中
RequestResponseBodyMethodProcessor : Using 'hehe/nba;charset=UTF-8', given [hehe/nba] and supported [application/json, application/*+json, application/xml;charset=UTF-8, text/xml;charset=UTF-8, application/*+xml;charset=UTF-8, hehe/nba;charset=UTF-8, hehe/nba]
而且我們開發的hehe/nba格式,暫時只處理了Car類。
總結
本文,我們自己通過內容協商,實現了返回多種格式響應的需求,而且不用改動任何業務代碼,只需做少量配置即可。另外,我們也通過引入XML的依賴,實現了Spring Boot對Jackson XML的自動配置。