矩阵变量

RFC 3986 讨论了路径段中的名称-值对。在 Web MVC 中, 我们根据 Tim Berners-Lee 的一篇 “旧文章” 将它们称为“矩阵变量”,但它们也可以称为 URI 路径参数。

矩阵变量可以出现在任何路径段中,每个变量之间用分号分隔,多个值之间用逗号分隔 (例如,/cars;color=red,green;year=2012)。也可以通过重复变量名来指定多个值 (例如,color=red;color=green;color=blue)。

如果预期 URL 包含矩阵变量,则控制器方法的请求映射必须使用 URI 变量来掩盖该变量内容, 并确保请求可以成功匹配,而不管矩阵变量的顺序和存在与否。 以下示例使用了矩阵变量:

  • Java

// GET /pets/42;q=11;r=22

@GET("/pets/{petId}")
public void findPet(@PathVariable String petId, @MatrixVariable int q) {

	// petId == 42
	// q == 11
}

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

  • Java

// GET /owners/42;q=11/pets/21;q=22

@GET("/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
}

可以将矩阵变量定义为可选的,并指定默认值,如下例所示:

  • Java

// GET /pets/42

@GET("/pets/{petId}")
public void findPet(@MatrixVariable(required=false, defaultValue="1") int q) {

  // q == 1
}

要获取所有矩阵变量,可以使用 MultiValueMap,如下例所示:

  • Java

// GET /owners/42;q=11;r=12/pets/21;q=22;s=23

@GET("/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]
}

请注意,您需要启用矩阵变量的使用。在 MVC Java 配置中,您需要通过 路径匹配 设置一个 removeSemicolonContent=falseUrlPathHelper。 在 MVC XML 命名空间中,您可以设置 <mvc:annotation-driven enable-matrix-variables="true"/>