Spring Boot下如何强制使用JAXB而非Jackson处理XML格式RequestBody
解决方案
核心问题原因:Spring Boot 类路径下存在jackson-dataformat-xml依赖时,会自动注册MappingJackson2XmlHttpMessageConverter,优先级高于默认基于JAXB实现的Jaxb2RootElementHttpMessageConverter。JAXB基于XSD生成的POJO携带的@XmlElement、@XmlElementWrapper等注解无法被Jackson完全兼容解析,就会出现外层对象解析正常、嵌套对象为null的问题。
方法1:调整HttpMessageConverter优先级(最推荐,不影响Jackson XML的其他业务使用)
手动将JAXB转换器的优先级提到最前,保证XML报文优先走JAXB解析,JSON格式以及其他需要用到Jackson XML的场景不受影响:
- 自定义WebMvc配置类,实现
WebMvcConfigurer接口,重写configureMessageConverters方法:
import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class JaxbWebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 把JAXB XML转换器添加到列表首位,优先触发 converters.add(0, new Jaxb2RootElementHttpMessageConverter()); } }
方法2:完全禁用Jackson XML转换器的自动注册
如果业务中不需要用Jackson处理XML,可直接排除相关自动配置:
- 在启动类的
@SpringBootApplication注解上添加排除规则:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersAutoConfiguration; @SpringBootApplication(exclude = {JacksonHttpMessageConvertersAutoConfiguration.class}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
验证规则
接口调试时打断点查看请求对应的HttpMessageConverter实现类为Jaxb2RootElementHttpMessageConverter即代表配置生效,嵌套对象可正常解析。
内容的提问来源于stack exchange,提问作者Rafał
相关产品推荐
相关产品推荐

