springboot自适应json和xml的原理以及请求响应过程

本文介绍如何在SpringBoot中添加XML响应支持,并详细解析请求处理流程。通过在pom.xml中添加Jackson XML依赖,实现根据客户端请求的Accept头自动选择JSON或XML格式返回数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正常来说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数据了。
springbootf返回 xml
springboot返回 json

感觉有点神奇,也太厉害了,于是翻阅了一下源码,看看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格式,在对现在支持的格式做循环,发现双发匹配即可用相应的转换器处理结果,如果没有找到,抛出异常。
这里我就截了大概的流程,具体的细节代码,大家可以打着断点走一走。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值