Spring Boot拓展XML格式的請求和響應(yīng)操作過程
在我們開發(fā)過程中,我們經(jīng)常使用的參數(shù)絕大多少事HTML和JSON格式的請求和響應(yīng)處理,但是我們在實際開發(fā)過程中,我們可能經(jīng)歷一些,比如對于XML格式的請求,我們在后端應(yīng)該如何接收,并且如何將XML格式的參數(shù)變成對象,然后返回一個XML對象呢?
實現(xiàn)原理
我們在處理XML格式的數(shù)據(jù)的時候,需要知道我們最初學(xué)習(xí)Spring系列中的Spring MVC。因為在Spring MVC中我們有一個消息轉(zhuǎn)換器的概念,其主要負(fù)責(zé)處理不同格式的請求數(shù)據(jù)進(jìn)行處理,然后將這個數(shù)據(jù)包裝成為對象,以便提供更加友好的變成體驗。
我們研究Spring MVC的源碼可以得到在Spring MVC中定義了一個HttpMessageCoverter接口,抽象了消息轉(zhuǎn)換器對類型的判斷,對讀寫的判斷與操作,具體如下:
public interface HttpMessageConverter<T> { boolean canRead(Class<?> clazz, @Nullable MediaType mediaType); boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType); List<MediaType> getSupportedMediaTypes(); T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException; void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException; }
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType)
:判斷給定的類和媒體類型是否可以被讀取。在處理請求時,用于判斷是否可以將請求的消息體轉(zhuǎn)換為指定的類對象。boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType)
:判斷給定的類和媒體類型是否可以被寫入。在處理響應(yīng)時,用于判斷是否可以將指定的類對象轉(zhuǎn)換為響應(yīng)的消息體。List<MediaType> getSupportedMediaTypes()
:獲取該消息轉(zhuǎn)換器支持的媒體類型列表。這些媒體類型表示該轉(zhuǎn)換器可以讀取或?qū)懭氲臄?shù)據(jù)格式。- -
Tread(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException
:將請求的消息體轉(zhuǎn)換為指定的類對象。該方法從 HttpInputMessage 中讀取請求的數(shù)據(jù),并將其轉(zhuǎn)換為指定的類對象。 void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException
:將指定的類對象轉(zhuǎn)換為響應(yīng)的消息體。該方法將指定的類對象轉(zhuǎn)換為字節(jié)流,并寫入到 HttpOutputMessage 中作為響應(yīng)的數(shù)據(jù)。
我們知道,在HTTP中,Content-Type中有各種不同的格式定義,如果需要支持XML格式的消息轉(zhuǎn)換,那就的使用對應(yīng)的轉(zhuǎn)換器,并且我們知道在Spring MVC中默認(rèn)已經(jīng)有一套采用Jackson實現(xiàn)的轉(zhuǎn)換器MappingJackson2XmlHttpMessageConverter
。
拓展實現(xiàn)
1. 引入XML消息轉(zhuǎn)換器
如果你是Spring 用戶,并非Spring Boot用戶,那么我們可以引入XML消息轉(zhuǎn)換器。
@Configuration public class MessageConverterConfig1 extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml(); builder.indentOutput(true); converters.add(new MappingJackson2XmlHttpMessageConverter(builder.build())); } }
如果你是Spring Boot用戶,那么就直接加入相關(guān)依賴就行了,那么相關(guān)依賴就交于Spring Boot自動實現(xiàn)了:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
2. 定義對象與XML的關(guān)系
做好了基礎(chǔ)配置后,就可以定義XML內(nèi)容對應(yīng)的Java對象了:
@Data @NoArgsConstructor @AllArgsConstructor @JacksonXmlRootElement(localName = "User") public class User { @JacksonXmlProperty(localName = "name") private String name; @JacksonXmlProperty(localName = "age") private Integer age; }
其中:@Data
、@NoArgsConstructor
、@AllArgsConstructor
是lombok簡化代碼的注解,主要用于生成get、set以及構(gòu)造函數(shù)。@JacksonXmlRootElement
、@JacksonXmlProperty
注解是用來維護(hù)對象屬性在xml中的對應(yīng)關(guān)系。
上述配置的User對象,其可以映射的Xml樣例如下(后續(xù)可以使用上述xml來請求接口):
<User> <name>miaow</name> <age>4</age> </User>
3.創(chuàng)建一個接收xml請求的接口
完成了需要轉(zhuǎn)換的對象之后,我們可以編寫一個相關(guān)接口來接受XML并返回xml。
@Controller public class UserController { @PostMapping(value = "/user", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE) @ResponseBody public User create(@RequestBody User user) { user.setName("姓名 : " + user.getName()); user.setAge(user.getAge() + 20); return user; } }
啟動項目之后,我們可以通過相關(guān)接口工具進(jìn)行請求發(fā)送,例如:
我采用的事ApiFox這個軟件,如果你有更好的軟件可以選擇您自己的軟件
到此這篇關(guān)于Spring Boot拓展XML格式的請求和響應(yīng)的文章就介紹到這了,更多相關(guān)Spring Boot XML請求和響應(yīng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解java JDK 動態(tài)代理類分析(java.lang.reflect.Proxy)
這篇文章主要介紹了詳解java JDK 動態(tài)代理類分析(java.lang.reflect.Proxy)的相關(guān)資料,需要的朋友可以參考下2017-06-06SpringBoot如何整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制
這篇文章主要給大家介紹了關(guān)于SpringBoot如何整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制的相關(guān)資料,文中通過圖文以及實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-01-01ElasticSearch之索引模板滾動索引實現(xiàn)詳解
這篇文章主要為大家介紹了ElasticSearch之索引模板滾動索引實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04JDK動態(tài)代理接口和接口實現(xiàn)類深入詳解
這篇文章主要介紹了JDK動態(tài)代理接口和接口實現(xiàn)類,JDK動態(tài)代理是代理模式的一種實現(xiàn)方式,因為它是基于接口來做代理的,所以也常被稱為接口代理,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06feign遠(yuǎn)程調(diào)用無法傳遞對象屬性405的問題
這篇文章主要介紹了feign遠(yuǎn)程調(diào)用無法傳遞對象屬性405的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼
本篇文章主要介紹了Java servlet 使用 PrintWriter 時的編碼與亂碼的示例代碼,探討了 PrintWriter 的缺省編碼與普通字符流的缺省編碼的差異,具有一定的參考價值,有興趣的可以了解一下2017-11-11