Spring@PathVariableアノテーション
1. 概要
このクイックチュートリアルでは、Springの@PathVariableアノテーションについて説明します。
簡単に言うと、 @PathVariableアノテーションを使用して、リクエストURIマッピングのテンプレート変数を処理し、それらをメソッドパラメーターとして設定できます。
@PathVariableとそのさまざまな属性の使用方法を見てみましょう。
2. 簡単なマッピング
@PathVariable アノテーションの単純な使用例は、主キーでエンティティを識別するエンドポイントです。
@GetMapping("/api/employees/{id}")
@ResponseBody
public String getEmployeesById(@PathVariable String id) {
return "ID: " + id;
}
この例では、 @PathVariable アノテーションを使用して、変数{id}で表されるURIのテンプレート部分を抽出します。
GETリクエストから/api / employees / {id} は、抽出されたID値を使用してgetEmployeesByIdを呼び出します。
http://localhost:8080/api/employees/111
----
ID: 111
次に、このアノテーションをさらに詳しく調べて、その属性を見てみましょう。
3. パス変数名の指定
前の例では、メソッドパラメーターとパス変数の名前が同じであるため、テンプレートパス変数の名前の定義をスキップしました。
ただし、パス変数名が異なる場合は、@PathVariableアノテーションの引数で指定できます。
@GetMapping("/api/employeeswithvariable/{id}")
@ResponseBody
public String getEmployeesByIdWithVariableName(@PathVariable("id") String employeeId) {
return "ID: " + employeeId;
}
http://localhost:8080/api/employeeswithvariable/1
----
ID: 1
わかりやすくするために、パス変数名を PathVariable( “id”)ではなく @PathVariable(value =” id”)として定義することもできます。
4. 1つのリクエストで複数のパス変数
ユースケースに応じて、コントローラーメソッドのリクエストURIに複数のパス変数を含めることができます。これには複数のメソッドパラメーターもあります:
@GetMapping("/api/employees/{id}/{name}")
@ResponseBody
public String getEmployeesByIdAndName(@PathVariable String id, @PathVariable String name) {
return "ID: " + id + ", name: " + name;
}
http://localhost:8080/api/employees/1/bar
----
ID: 1, name: bar
複数の処理も可能です @PathVariable タイプのメソッドパラメータを使用するパラメータ java.util.Map
@GetMapping("/api/employeeswithmapvariable/{id}/{name}")
@ResponseBody
public String getEmployeesByIdAndNameWithMapVariable(@PathVariable Map<String, String> pathVarsMap) {
String id = pathVarsMap.get("id");
String name = pathVarsMap.get("name");
if (id != null && name != null) {
return "ID: " + id + ", name: " + name;
} else {
return "Missing Parameters";
}
}
http://localhost:8080/api/employees/1/bar
----
ID: 1, name: bar
ただし、パス変数文字列にドット(。)文字が含まれている場合、複数の@ PathVariable パラメーターを処理する際に、小さな問題が発生します。 これらのコーナーケースについては、ここで詳しく説明しました。
5. オプションのパス変数
Springでは、デフォルトで@PathVariableで注釈が付けられたメソッドパラメーターが必要です。
@GetMapping(value = { "/api/employeeswithrequired", "/api/employeeswithrequired/{id}" })
@ResponseBody
public String getEmployeesByIdWithRequired(@PathVariable String id) {
return "ID: " + id;
}
外観を考えると、上記のコントローラーは / api /employeeswithrequiredと/api / employeeswithrequired /1の両方のリクエストパスを処理する必要があります。 ただし、 @PathVariables でアノテーションが付けられたメソッドパラメーターはデフォルトで必須であるため、 / api /employeeswithrequiredパスに送信されたリクエストは処理されません。
http://localhost:8080/api/employeeswithrequired ---- {"timestamp":"2020-07-08T02:20:07.349+00:00","status":404,"error":"Not Found","message":"","path":"/api/employeeswithrequired"}
http://localhost:8080/api/employeeswithrequired/1 ---- ID: 111
これは2つの異なる方法で処理できます。
5.1. @PathVariableを不要として設定する
@PathVariableの必須プロパティをfalseに設定して、オプションにすることができます。したがって、前の例を変更して、パス変数がある場合とない場合のURIバージョンを処理できるようになりました。
@GetMapping(value = { "/api/employeeswithrequiredfalse", "/api/employeeswithrequiredfalse/{id}" })
@ResponseBody
public String getEmployeesByIdWithRequiredFalse(@PathVariable(required = false) String id) {
if (id != null) {
return "ID: " + id;
} else {
return "ID missing";
}
}
http://localhost:8080/api/employeeswithrequiredfalse
----
ID missing
5.2. java.util.Optionalを使用する
Spring 4.1の導入以来、私たちも使用することができます java.util.Optional
@GetMapping(value = { "/api/employeeswithoptional", "/api/employeeswithoptional/{id}" })
@ResponseBody
public String getEmployeesByIdWithOptional(@PathVariable Optional<String> id) {
if (id.isPresent()) {
return "ID: " + id.get();
} else {
return "ID missing";
}
}
ここで、リクエストでパス変数 id を指定しない場合、デフォルトの応答が得られます。
http://localhost:8080/api/employeeswithoptional
----
ID missing
5.3. タイプのメソッドパラメータの使用地図
前に示したように、タイプ java.util.Map の単一のメソッドパラメーターを使用して、リクエストURIのすべてのパス変数を処理できます。 この戦略を使用して、オプションのパス変数の場合を処理することもできます:
@GetMapping(value = { "/api/employeeswithmap/{id}", "/api/employeeswithmap" })
@ResponseBody
public String getEmployeesByIdWithMap(@PathVariable Map<String, String> pathVarsMap) {
String id = pathVarsMap.get("id");
if (id != null) {
return "ID: " + id;
} else {
return "ID missing";
}
}
6. @PathVariableのデフォルト値
箱から出して、@PathVariableでアノテーションが付けられたメソッドパラメーターのデフォルト値を定義するための規定はありません。 ただし、上記と同じ戦略を使用して、 @PathVariableのデフォルト値のケースを満たすことができます。パス変数で、nullをチェックする必要があります。
たとえば、 java.util.Optional
@GetMapping(value = { "/api/defaultemployeeswithoptional", "/api/defaultemployeeswithoptional/{id}" })
@ResponseBody
public String getDefaultEmployeesByIdWithOptional(@PathVariable Optional<String> id) {
if (id.isPresent()) {
return "ID: " + id.get();
} else {
return "ID: Default Employee";
}
}
7. 結論
この記事では、Springの@PathVariableアノテーションの使用方法について説明しました。 また、 @PathVariable アノテーションを効果的に使用して、オプションのパラメーターやデフォルト値の処理など、さまざまなユースケースに適合するさまざまな方法を特定しました。
この記事に示されているコード例は、Githubでも利用できます。