在 Spring REST 中的 @RequestBody 中使用 XML
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
套件中,並且我們不需要向應用程式添加任何其他依賴項。
在從 9 開始的 Java 版本中, javax
套件被移動並重新命名為jakarta,
因此 JAXB 需要額外的依賴:
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
此外,它需要 XML 映射器的運行時實現,這可能會造成太多混亂和微妙的問題。
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 格式。我們在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。總的來說,過渡是透明的,整個設定是透過幾個策略性放置的註釋完成的。
與往常一樣,本教程中的程式碼可以在 GitHub 上取得。