Spring Boot 2.3+ 和 JDK 11+ 需同时引入 jackson-dataformat-xml、jakarta.xml.bind-api 和 jaxb-runtime 依赖,并在实体类添加 @XmlRootElement 和 @XmlElement 注解,Controller 方法必须显式声明 consumes/produces 为 application/xml,否则 XML 序列化/反序列化会静默失败或报错。

依赖加不对,XML根本不会生效
Spring Boot 2.3+ 默认不带 JAXB,Java 11+ 也移除了 javax.xml.bind,光靠 jackson-dataformat-xml 是不够的——它只能序列化,但反序列化 XML 请求体(@RequestBody)时若没 JAXB 注解支持,会静默失败或报 HttpMessageNotReadableException。
- 必须同时引入:
com.fasterxml.jackson.dataformat jackson-dataformat-xml jakarta.xml.bind jakarta.xml.bind-api org.glassfish.jaxb jaxb-runtime - 注意:用的是
jakarta.*(不是旧的javax.*),否则 Spring Boot 3.x 或 JDK 17+ 下直接类找不到 -
jackson-dataformat-xml会自动注册MappingJackson2XmlHttpMessageConverter,无需手动配置转换器
@XmlRootElement 和 @XmlElement 不写,字段就不出现在 XML 里
哪怕依赖全了,实体类没加 JAXB 注解,返回的 XML 也是空标签或只有根节点。Spring MVC 的默认 XML 转换器(Jaxb2RootElementHttpMessageConverter)严格依赖这些注解,而 Jackson XML 模块(XmlMapper)在未显式启用注解支持时也会忽略字段。
- 类上必须加
@XmlRootElement(name = "user")(name决定根元素名) - 每个要序列化的字段,要么有 public getter +
@XmlElement(name = "age"),要么用 Lombok 的@Getter+ 显式加@XmlElement在 getter 上 - 无参构造函数必须存在(Lombok 的
@NoArgsConstructor或手动写) - 别用
@JsonProperty替代@XmlElement—— 它对 XML 无效
Controller 方法得明确声明 consumes/produces,否则浏览器或 Postman 发 XML 请求会 406
Spring Boot 不会“猜”你想用 XML;它靠 Accept 请求头或 URL 参数匹配 produces,靠 Content-Type 匹配 consumes。没声明,就会 fallback 到 JSON 转换器,然后报错或返回 JSON。
- 接收 XML 请求体:方法参数加
@RequestBody,并在@PostMapping中写consumes = MediaType.APPLICATION_XML_VALUE - 返回 XML 响应:加
produces = MediaType.APPLICATION_XML_VALUE,或全局用@ResponseBody+ 配置内容协商 - 示例:
@PostMapping(path = "/user", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE) public User createUser(@RequestBody User user) { return user; } - Postman 测试时,Header 必须设
Content-Type: application/xml和Accept: application/xml
想让所有接口默认返回 XML?别信 defaultContentType 那套
Spring Boot 2.2+ 中,configurer.defaultContentType(MediaType.APPLICATION_XML) 几乎无效——因为 HeaderContentNegotiationStrategy 优先级更高,只要请求头带 Accept: */* 或没带 Accept,它就按默认值走,但实际仍可能被其他策略覆盖。
- 真正可控的方式是:强制指定
produces,或统一加@RequestMapping(produces = MediaType.APPLICATION_XML_VALUE)到 Controller 类上 - 如果真要内容协商(比如
?format=xml),需自定义ContentNegotiationManager,并显式添加ParameterContentNegotiationStrategy - 不推荐全局设 XML 默认——REST API 多数场景需兼容 JSON,硬切容易导致前端调用失败且难以排查










