正常来说springboot的默认response的返回类型都是以json的形式,这几天主管让我看看能不能兼容一下xml。
于是我在pom.xml下加入了对解析成xml的支持。
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.11.1</version>
</dependency>
本来我以为要根据客户端的请求的不同的header的Accept来做不同的解析(xml或者json)
结果很神奇,只要加了以上依赖依旧,而我什么都没做,只要访问接口的同时,加上Accept=application/xml,结果就已经是处理好的xml数据了。


感觉有点神奇,也太厉害了,于是翻阅了一下源码,看看springboot是怎么做了处理的。
我把过程大致的分为两部分。
1、Springboot加入对xml的支持。
2、请求的时候带上xml的Accept的请求流程解析过程。
1、Springboot加入对xml的支持。
先看看WebMvcConfigurationSupport.java
springboot检测到了XmlMapper类的存在,所以给jackson2XmlPresent设置为true。
addDefaultHttpMessageConverters()方法
由于jackson2XmlPresent为true,所以这里会添加对xml的支持。


以上算是加上了xml的支持了。
2、请求的时候带上xml的Accept的请求流程解析过程。
接下来我们来走一个请求的流程。
打开postman,输入请求接口以及Accept的值。

请求流程进入到DispatcherServlet.class和doService()方法下,再进入到doDispatch()

doDispatch()方法里有一个handle()方法,他可以根据映射找到对应的controller。

handle()是接口下HandlerAdapter下的一个方法,我们找到他的实现类AbstractHandlerMethodAdapter.class。

在通过实现类的handle()方法里发现了他调用的handleInternal()


找到子类RequestMappingHandlerAdapter.class, 查看具体的实现

invokeHandlerMethod()方法

invokeAndHandle()方法,这里以及拿到了返回的结果

下面有一句handleReturnValue()方法 处理返回的结果


这里进入RequestResponseBodyMethodProcessor.class的handleReturnValue方法


找到客户端需要的accept格式,在对现在支持的格式做循环,发现双发匹配即可用相应的转换器处理结果,如果没有找到,抛出异常。
这里我就截了大概的流程,具体的细节代码,大家可以打着断点走一走。
本文介绍如何在SpringBoot中添加XML响应支持,并详细解析请求处理流程。通过在pom.xml中添加Jackson XML依赖,实现根据客户端请求的Accept头自动选择JSON或XML格式返回数据。
6508





