Spring Boot添加jackson-dataformat-xml后JSON解析为XML报错
问题原因及解决办法
核心原因
当你添加com.fasterxml.jackson.dataformat:jackson-dataformat-xml依赖后,Spring Boot会自动注册MappingJackson2XmlHttpMessageConverter作为请求消息转换器。默认情况下,这个XML转换器的优先级高于处理JSON的MappingJackson2HttpMessageConverter。即使你请求头设置了Content-Type: application/json,Spring的请求处理链会优先用XML转换器尝试解析请求体,自然就会出现"期望'<', 却遇到'{' "的解析错误。
另外,如果你控制器的POST映射仅声明支持JSON和XML类型(比如consumes = {"application/json", "application/xml"}),但未明确约束请求头的匹配逻辑,结合转换器优先级问题,就会触发错误的解析逻辑。
可行解决方案
1. 调整消息转换器优先级,确保JSON转换器先执行
创建配置类,手动注册JSON转换器并设置最高优先级:
import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 优先添加JSON转换器,确保优先级最高 converters.add(0, new MappingJackson2HttpMessageConverter()); // 保留XML转换器(若需要XML支持) converters.add(new MappingJackson2XmlHttpMessageConverter()); } }
2. 显式约束控制器接口的媒体类型匹配
在POST映射上,通过consumes属性明确指定媒体类型顺序,让Spring优先匹配JSON:
@PostMapping(value = "/your-endpoint", consumes = {"application/json", "application/xml"}) public ResponseEntity<?> yourMethod(@RequestBody YourDto dto) { // 业务逻辑实现 }
注意这里的顺序:application/json放在前面,Spring会优先调用对应的JSON转换器处理请求。
3. 禁用XML转换器自动配置(若不需要XML支持)
如果只是误加了XML依赖,完全不需要处理XML请求,可以在配置文件中禁用相关自动配置:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration
这种方式仅适合确定不需要XML功能的场景,否则不推荐使用。
内容的提问来源于stack exchange,提问作者Keith Bennett
相关产品推荐
相关产品推荐

