矩陣變數
矩陣變數可以出現在任何路徑段中,每個變數之間用分號分隔,多個值之間用逗號分隔——例如,"/cars;color=red,green;year=2012"
。也可以透過重複變數名來指定多個值——例如,"color=red;color=green;color=blue"
。
與 Spring MVC 不同,在 WebFlux 中,URL 中是否存在矩陣變數不影響請求對映。換句話說,您無需使用 URI 變數來遮蔽變數內容。但是,如果您想從控制器方法中訪問矩陣變數,則需要在預期矩陣變數存在的路徑段中新增一個 URI 變數。以下示例展示瞭如何實現:
-
Java
-
Kotlin
// GET /pets/42;q=11;r=22
@GetMapping("/pets/{petId}")
public void findPet(@PathVariable String petId, @MatrixVariable int q) {
// petId == 42
// q == 11
}
// GET /pets/42;q=11;r=22
@GetMapping("/pets/{petId}")
fun findPet(@PathVariable petId: String, @MatrixVariable q: Int) {
// petId == 42
// q == 11
}
鑑於所有路徑段都可以包含矩陣變數,您有時可能需要明確指定矩陣變數預期屬於哪個路徑變數,如下例所示:
-
Java
-
Kotlin
// GET /owners/42;q=11/pets/21;q=22
@GetMapping("/owners/{ownerId}/pets/{petId}")
public void findPet(
@MatrixVariable(name="q", pathVar="ownerId") int q1,
@MatrixVariable(name="q", pathVar="petId") int q2) {
// q1 == 11
// q2 == 22
}
@GetMapping("/owners/{ownerId}/pets/{petId}")
fun findPet(
@MatrixVariable(name = "q", pathVar = "ownerId") q1: Int,
@MatrixVariable(name = "q", pathVar = "petId") q2: Int) {
// q1 == 11
// q2 == 22
}
您可以將矩陣變數定義為可選,並指定一個預設值,如下例所示:
-
Java
-
Kotlin
// GET /pets/42
@GetMapping("/pets/{petId}")
public void findPet(@MatrixVariable(required=false, defaultValue="1") int q) {
// q == 1
}
// GET /pets/42
@GetMapping("/pets/{petId}")
fun findPet(@MatrixVariable(required = false, defaultValue = "1") q: Int) {
// q == 1
}
要獲取所有矩陣變數,請使用 MultiValueMap
,如下例所示:
-
Java
-
Kotlin
// GET /owners/42;q=11;r=12/pets/21;q=22;s=23
@GetMapping("/owners/{ownerId}/pets/{petId}")
public void findPet(
@MatrixVariable MultiValueMap<String, String> matrixVars,
@MatrixVariable(pathVar="petId") MultiValueMap<String, String> petMatrixVars) {
// matrixVars: ["q" : [11,22], "r" : 12, "s" : 23]
// petMatrixVars: ["q" : 22, "s" : 23]
}
// GET /owners/42;q=11;r=12/pets/21;q=22;s=23
@GetMapping("/owners/{ownerId}/pets/{petId}")
fun findPet(
@MatrixVariable matrixVars: MultiValueMap<String, String>,
@MatrixVariable(pathVar="petId") petMatrixVars: MultiValueMap<String, String>) {
// matrixVars: ["q" : [11,22], "r" : 12, "s" : 23]
// petMatrixVars: ["q" : 22, "s" : 23]
}