マトリックス変数

RFC 3986 [IETF] (英語) は、パスセグメント内の名前と値のペアについて説明します。Spring MVC では、Tim Berners-Lee による「古い投稿 [W3C] (英語) 」に基づいて「マトリックス変数」と呼んでいますが、URI パスパラメーターと呼ぶこともできます。

マトリックス変数は任意のパスセグメントに記述でき、各変数はセミコロンで区切られ、複数の値はコンマで区切られます(例: /cars;color=red,green;year=2012)。複数の値は、変数名を繰り返して指定することもできます(例: color=red;color=green;color=blue)。

URL にマトリックス変数が含まれると予想される場合、コントローラーメソッドのリクエストマッピングでは、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]
}

マトリックス変数の使用を有効にする必要があることに注意してください。MVC Java 構成では、UrlPathHelper を removeSemicolonContent=false からパスマッチングで設定する必要があります。MVC XML 名前空間では、<mvc:annotation-driven enable-matrix-variables="true"/> を設定できます。