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

矩阵变量

RFC 3986 讨论了 路径段。在Spring WebFlux中,我们称这些为“矩阵变量”,基于Tim Berners-Lee的一篇“旧文章”,但它们 也可以称为URI路径参数。spring-doc.cadn.net.cn

矩阵变量可以出现在任意路径段中,每个变量之间用分号分隔,且 多个用逗号分隔的值——例如,“/cars;color=红色,绿色;年份=2012”.倍数 值也可以通过重复的变量名来指定——例如,“颜色=红色;颜色=绿色;color=blue”.spring-doc.cadn.net.cn

与 Spring MVC 不同,WebFlux 中 URL 中矩阵变量的存在与否会 不会影响请求映射。换句话说,你不必使用URI变量 用来掩盖可变内容。话虽如此,如果你想从 控制器方法中,你需要在矩阵 变量是预期的。以下示例展示了如何实现: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
}

鉴于所有路径段都可以包含矩阵变量,有时你可能需要 区分矩阵变量预期属于哪个路径变量, 如下示例所示: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
}
@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
}

要获得所有矩阵变量,请使用多价值地图,如下示例所示: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]
}