对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

矩阵变量

RFC 3986 在 路径段。在 Spring MVC 中,我们根据 Tim Berners-Lee 的“旧帖子”将这些变量称为“矩阵变量”,但它们 也可以称为 URI 路径参数。spring-doc.cadn.net.cn

矩阵变量可以出现在任何路径段中,每个变量用分号和 用逗号分隔的多个值(例如/cars;color=red,green;year=2012).倍数 值也可以通过重复的变量名称来指定(例如color=red;color=green;color=blue).spring-doc.cadn.net.cn

如果 URL 应包含矩阵变量,则控制器的请求映射 方法必须使用 URI 变量来掩盖该变量内容,并确保请求可以 成功匹配,与矩阵变量顺序和存在无关。 以下示例使用 matrix 变量:spring-doc.cadn.net.cn

// 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
}

鉴于所有路径段都可能包含矩阵变量,您有时可能需要 消除 matrix 变量预期位于哪个 path 变量的歧义。 以下示例显示了如何执行此作:spring-doc.cadn.net.cn

// 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
}

矩阵变量可以定义为可选变量,并指定默认值,如 以下示例显示:spring-doc.cadn.net.cn

// 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,如下例所示:spring-doc.cadn.net.cn

// 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]
}

请注意,您需要启用矩阵变量的使用。在 MVC Java 配置中, 您需要设置UrlPathHelperremoveSemicolonContent=false通过 Path Matching。在 MVC XML 命名空间中,您可以设置<mvc:annotation-driven enable-matrix-variables="true"/>.spring-doc.cadn.net.cn