添加XML解析后API默认返回XML,如何保持默认JSON响应?
这个问题我之前也碰到过,本质是Spring Boot引入JAXB相关依赖后,内容协商(Content Negotiation)的默认行为发生了变化——原本只有Jackson负责JSON序列化,现在JAXB加入后,当请求没有明确指定Accept头时,Spring可能优先选择返回XML格式。下面给你几个不用逐个端点加produces = "application/json"的解决方案:
方案1:通过配置类全局设置默认响应类型
创建一个WebMvc配置类,重写内容协商配置,把JSON设为默认响应格式,同时保留XML的解析支持:
@Configuration public class WebMvcContentConfig implements WebMvcConfigurer { @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { // 设置默认响应为JSON configurer.defaultContentType(MediaType.APPLICATION_JSON) // 注册JSON和XML的媒体类型映射 .mediaType("json", MediaType.APPLICATION_JSON) .mediaType("xml", MediaType.APPLICATION_XML); } }
这样配置后,所有未指定Accept头的请求都会默认返回JSON,而当请求明确指定Accept: application/xml时,依然可以返回XML(如果你的端点支持的话),同时完全不影响XML格式的请求体解析。
方案2:通过配置文件快速修改(推荐)
如果你用的是Spring Boot 2.x及以上版本,直接在配置文件里修改内容协商的默认值即可,无需编写配置类:
application.properties
# 设置默认响应类型为JSON spring.mvc.contentnegotiation.default-content-type=application/json # 注册媒体类型映射 spring.mvc.contentnegotiation.media-types.json=application/json spring.mvc.contentnegotiation.media-types.xml=application/xml
application.yml
spring: mvc: contentnegotiation: default-content-type: application/json media-types: json: application/json xml: application/xml
问题根源说明
在你添加JAXB之前,Spring Boot的消息转换器里只有Jackson的MappingJackson2HttpMessageConverter负责处理JSON的序列化和反序列化,所以默认返回JSON。当引入JAXB相关依赖后,Spring会自动注册Jaxb2RootElementHttpMessageConverter来处理XML格式,此时内容协商机制在没有明确Accept头的情况下,会根据注册的转换器顺序或默认策略选择返回类型,导致默认返回XML。上面的配置就是强制把JSON设为默认的响应格式,同时保留XML的输入解析能力(完美匹配你解析XML存入数据库的需求)。
内容的提问来源于stack exchange,提问作者Mithrand1r

