1. 概述
儘管 JSON 是一種 RESTful 服務中的事實標準,但在某些情況下,我們可能需要使用 XML。我們可能出於以下原因選擇 XML:遺留應用程序、使用更冗長的格式、標準化的模式等。
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 版本管理系統,省略版本號,從而確保所有依賴項使用正確的 Jackson 庫版本。
或者,我們可以使用 JAXB 實現相同的功能,但總體而言,它更冗餘,Jackson 通常能提供更友好的 API。但是,如果我們在使用 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 映射器的運行時實現,這可能會造成過多混淆和微妙的問題。
3. Endpoints
由於JSON是Spring REST控制器默認的格式,我們需要明確標識消費和產生XML的端點。 讓我們考慮這個簡單的Echo控制器:
@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 格式,我們在 @PostMapping 中明確指定了它。對於 JSON,我們可以省略 consumes 和 produces 屬性。
第二個端點使用 XML。我們必須通過為 consumes 和 produces 值提供正確的類型來明確標識它。這是我們配置端點所需要做的唯一事情。
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 可能需要顯式映射。
5. 結論
Spring REST 提供了創建 RESTful 服務的一種便捷方式。然而,它們並不侷限於 JSON 格式。我們可以使用它們與其它格式,例如 XML。<mark>總體而言,過渡是透明的,整個設置都依賴於多個戰略性放置的註解。</mark>