1. 概述
虽然JSON是RESTful服务的默认标准,但在某些场景下我们可能需要使用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接口:必须显式声明consumes和produces为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获取。