1、概览 {#1概览}
虽然 JSON 是 RESTful 服务的事实标准,但在某些情况下,可能需要使用 XML。例如:老掉牙的银行 API 就是通过 XML 进行交互的。
Spring 通过 Jackson XML 提供了一种简单的方法来支持 XML 端点。
2、依赖 {#2依赖}
第一步是添加 依赖。注意 spring-boot-starter-web
Starter 默认不包含支持 XML 的库。需要手动添加:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
另外,也可以使用 JAXB 来实现,但总的来说,JAXB 更啰嗦,而且 API 没有 Jackson 那么优雅好用。不过,如果使用的是 Java 8,JAXB 库与实现都位于 javax
包中,因此无需在应用中添加任何其他依赖。
在 Java 9 开始的版本中,javax
包被移动并更名为 jakarta
,因此 JAXB 需要额外的 依赖:
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
另外,它需要一个运行时实现来处理 XML Mapper,这可能会导致其他的问题。
3、端点 {#3端点}
由于 JSON 是 Spring REST Controller 的默认格式,因此需要在端点上明确配置 "消费" 和 "生产" 的数据类型是 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;
}
}
Controller 的唯一目的是接收 User
并将其返回。这两个端点之间的唯一区别是,第一个端点使用 JSON 格式。在 @PostMapping
中明确指定了它,对于 JSON 格式,可以省略 consumes
和 produces
属性。
第二个端点使用 XML。必须为 consumes
值和 produces
值提供正确的类型,这是配置端点所需做的唯一一件事。
4、映射对象 {#4映射对象}
使用以下 User
类:
public class User {
private Long id;
private String firstName;
private String secondName;
public User() {
}
// Get、Set 等方法省略
}
从技术上讲,不需要其他任何东西,端点就能直接支持以下 XML:
<User>
<id>1</id>
<firstName>John</firstName>
<secondName>Doe</secondName>
</User>
然而,如果想提供其他名称或将旧有的约定转换为在应用中使用的约定,可以使用特殊的注解。@JacksonXmlRootElement
和 @JacksonXmlProperty
是用于此目的最常用的注解。
如果选择使用 JAXB ,也可以只用注解来配置映射,而且还有一组不同的注解,例如 @XmlRootElement
和 @XmlAttribute
。总的来说,过程非常相似。但注意,JAXB 可能需要显式映射。
5、总结 {#5总结}
本文介绍了如何配置 Spring 以接收和返回 XML 格式的数据。
Ref:https://www.baeldung.com/spring-xml-requestbody