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 (Java 8以降で使用可能)必須ではないパス変数を処理するには:

@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 、パス変数がヌルか否か。 null、の場合、デフォルト値でリクエストに応答できます。

@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でも利用できます。