|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
矩阵变量
矩阵变量可以出现在任意路径段中,每个变量以分号分隔,多个值以逗号分隔(例如:/cars;color=red,green;year=2012)。也可以通过重复变量名来指定多个值(例如:color=red;color=green;color=blue)。
如果某个 URL 预期包含矩阵变量(matrix variables),则控制器方法的请求映射必须使用 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
}
// GET /owners/42;q=11/pets/21;q=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]
}
请注意,您需要启用矩阵变量(matrix variables)的使用。在 MVC 的 Java 配置中,您需要通过路径匹配(Path Matching)设置一个 xref page,并将其 ../../mvc-config/path-matching.html 属性设为 <mvc:annotation-driven enable-matrix-variables="true"/>。在 MVC 的 XML 命名空间中,您可以设置 5。