Spring Boot 3.x默认不支持XML绑定,需添加jackson-dataformat-xml依赖,用@JacksonXmlRootElement等注解替代JAXB,Controller中必须显式声明consumes和produces,并手动配置XmlMapper Bean。

Spring Boot默认不支持XML绑定,需手动引入依赖
Spring Boot 3.x 默认只启用 JSON 处理(jackson-databind),对 XML 的 @RequestBody 绑定会直接抛出 HttpMediaTypeNotSupportedException。这不是配置问题,而是缺少底层 XML 序列化器。
必须显式添加 Jackson 的 XML 支持:
com.fasterxml.jackson.dataformat jackson-dataformat-xml
注意:不要用 spring-boot-starter-web-services,它面向 SOAP,和 REST 接口的 XML body 绑定无关。
使用@JacksonXmlRootElement标记实体类
普通 @XmlRootElement(JAXB)在 Spring Boot 3+ 中已失效——JAXB 被移除,必须改用 Jackson XML 注解。
实体类需满足:
-
@JacksonXmlRootElement(localName = "user")声明根元素名(否则默认用类名小写) - 字段用
@JacksonXmlProperty(localName = "name")控制字段映射的 XML 标签名 - 集合字段加
@JacksonXmlElementWrapper(useWrapping = false)可去掉外层包装标签
示例:
import com.fasterxml.jackson.dataformat.xml.annotate.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.annotate.JacksonXmlProperty;
@JacksonXmlRootElement(localName = "user")
public class User {
@JacksonXmlProperty(localName = "full-name")
private String name;
@JacksonXmlProperty(localName = "age")
private int age;
// getter/setter...
}
Controller中接收XML需声明consumes = MediaType.APPLICATION_XML_VALUE
Spring 不会自动根据请求头 Content-Type 选择解析器,必须在 @PostMapping 显式指定 consumes,否则即使请求是 application/xml,也会走默认的 JSON 解析路径并报错。
正确写法:
@PostMapping(value = "/users", consumes = MediaType.APPLICATION_XML_VALUE) public ResponseEntitycreateUser(@RequestBody User user) { // ... return ResponseEntity.ok("OK"); }
常见错误:
- 漏写
consumes→ 触发415 Unsupported Media Type - 写成
produces = ...→ 不影响入参解析,纯属无效 - XML 请求体含 XML 声明(
)→ Jackson 默认允许,无需额外配置
XML响应返回需配置produces并确保有XmlMapper Bean
返回 XML 时,仅加 produces = MediaType.APPLICATION_XML_VALUE 不够,Spring 还需能查到可用的 XmlMapper 实例。Spring Boot 2.6+ 之后不会自动配置 XmlMapper Bean,必须手动注册:
@Bean
public XmlMapper xmlMapper() {
return new XmlMapper();
}
否则会报 No converter found for return value of type: class xxx.User。
Controller 示例:
@GetMapping(value = "/users/{id}", produces = MediaType.APPLICATION_XML_VALUE)
public User getUser(@PathVariable Long id) {
return new User("Alice", 30);
}
注意:返回 XML 时,@JacksonXmlRootElement 的 localName 会作为根标签名;若未指定,则用类名小写(如 user),但不可含大写字母或特殊符号。
容易忽略的一点:如果项目同时用了 Lombok,记得为 @Data 类显式加 @NoArgsConstructor,否则 XML 反序列化时因无默认构造器而失败。










