正常来说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格式,在对现在支持的格式做循环,发现双发匹配即可用相应的转换器处理结果,如果没有找到,抛出异常。
这里我就截了大概的流程,具体的细节代码,大家可以打着断点走一走。