1. 概述

虽然JSONRESTful服务的默认标准,但在某些场景下我们可能需要使用XML。回退到XML的原因多种多样:遗留系统集成、需要更详细的格式、标准化schema等。

Spring为我们提供了几乎零配置的XML支持方案。本教程将演示如何利用Jackson XML实现这一功能。

2. 依赖

首先需要添加XML映射的依赖。即使使用spring-boot-starter-web,默认也不包含XML支持库:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.16.0</version>
</dependency>

✅ 可以省略版本号,利用Spring Boot的版本管理机制确保依赖兼容性。

替代方案是使用JAXB,但存在以下问题:

  • JAXB配置更繁琐,Jackson API更友好
  • Java 8中JAXB位于javax包,无需额外依赖
  • ⚠️ Java 9+中javax包迁移至jakarta,需添加额外依赖
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>4.0.0</version>
</dependency>

JAXB还需要运行时实现,容易引发配置问题。

3. 接口

由于JSON是Spring REST控制器的默认格式,需要显式声明XML接口。以下是一个简单的回显控制器示例:

@RestController
@RequestMapping("/users")
public class UserEchoController {
    @ResponseStatus(HttpStatus.CREATED)
    @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public User echoJsonUser(@RequestBody User user) {
        return user;
    }

    @ResponseStatus(HttpStatus.CREATED)
    @PostMapping(consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
    public User echoXmlUser(@RequestBody User user) {
        return user;
    }
}

控制器功能简单:接收并返回User对象。两个接口的区别在于:

  • JSON接口:可省略consumes/produces属性(默认值)
  • XML接口:必须显式声明consumesproduces为XML类型

4. 映射

使用以下User类:

public class User {
    private Long id;
    private String firstName;
    private String secondName;

    public User() {
    }

    // getters, setters, equals, hashCode
}

默认支持以下XML格式:

<User>
    <id>1</id>
    <firstName>John</firstName>
    <secondName>Doe</secondName>
</User>

✅ 如需自定义字段名或适配遗留格式,可使用特殊注解

  • @JacksonXmlRootElement
  • @JacksonXmlProperty

若使用JAXB,可通过另一套注解配置:

  • @XmlRootElement
  • @XmlAttribute

⚠️ JAXB通常需要显式映射,而Jackson更灵活。

5. 总结

Spring REST不仅支持JSON,也能轻松处理XML等格式。整个配置过程透明简单,只需几个关键注解即可完成。

完整代码示例可在GitHub获取。


原始标题:Using XML in @RequestBody in Spring REST | Baeldung