配置 Spring 以接收和返回 XML 格式的数据

1、概览

虽然 JSON 是 RESTful 服务的事实标准,但在某些情况下,可能需要使用 XML。例如:老掉牙的银行 API 就是通过 XML 进行交互的。

Spring 通过 Jackson XML 提供了一种简单的方法来支持 XML 端点。

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、端点

由于 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 格式,可以省略 consumesproduces 属性。

第二个端点使用 XML。必须为 consumes 值和 produces 值提供正确的类型,这是配置端点所需做的唯一一件事。

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、总结

本文介绍了如何配置 Spring 以接收和返回 XML 格式的数据。


Ref:https://www.baeldung.com/spring-xml-requestbody