@PathVariableの使い方と引数を徹底解説!【初心者向け】

@PathVariableって?

@PathVariableは、

「URLパスの一部を変数として扱うためのアノテーション」

です。

たとえば、URLに含まれるIDやユーザー名などの動的な部分を抽出し、それをコントローラーのメソッドに引き渡すことができます。これにより、リクエストURLに応じたデータ処理を行うことが可能になります。

基本的には、RESTful API開発で頻繁に使用され、GETDELETEなどのHTTPリクエストで動的なパス変数を処理する際に非常に役立ちます。

基本的な使い方

では、@PathVariableを使用した簡単な例を見てみましょう。特定のユーザーIDに基づいて、そのユーザー情報を取得するケースです。

サーバー側のコード

@GetMapping("/users/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
    User user = userService.findById(id);
    return ResponseEntity.ok(user);
}

この例では、/users/1のようなURLにアクセスする際、{id}の部分に1がマッピングされ、メソッド引数のidに値が渡されます。このidを使ってユーザー情報を取得し、クライアントに返しています。

@PathVariableを使うことで、動的に変化するURLの一部を柔軟に処理できる点が魅力です。

クライアント側のリクエスト例

GET http://localhost:8080/users/1

このように、GETリクエストを送信すると、サーバーは1というIDを持つユーザー情報を返します。

複数のパス変数を使用する方法

@PathVariableは1つだけでなく、複数のパス変数を同時に使用することもできます。たとえば、ユーザーIDと注文IDを取得するケースを見てみましょう。

サーバー側のコード

@GetMapping("/users/{userId}/orders/{orderId}")
public ResponseEntity<Order> getUserOrder(@PathVariable Long userId, @PathVariable Long orderId) {
    Order order = orderService.findByUserIdAndOrderId(userId, orderId);
    return ResponseEntity.ok(order);
}

このコードでは、2つのパス変数userIdorderIdを使用しています。リクエストURLが/users/1/orders/100のようになっている場合、それぞれuserId1orderId100がマッピングされます。

複数のパス変数を使用することで、より細かい情報をリクエストURLで指定できるようになります。

オプションのパス変数

パス変数を必須とせず、存在しなくても対応できるようにすることも可能です。以下の例では、userIdをオプションとして扱っています。

サーバー側のコード

@GetMapping({"/users", "/users/{userId}"})
public ResponseEntity<?> getUserOrAllUsers(@PathVariable(required = false) Long userId) {
    if (userId != null) {
        return ResponseEntity.ok(userService.findById(userId));
    } else {
        return ResponseEntity.ok(userService.findAll());
    }
}

この場合、/usersにアクセスするとすべてのユーザー情報が返され、/users/1にアクセスすると特定のユーザー情報が返されます。

@PathVariable(required = false)を使用することで、パス変数が必須でないリクエストにも柔軟に対応可能です。

パス変数とクエリパラメータの違い

@PathVariableと似た概念に@RequestParamがありますが、これらは役割が異なります。@PathVariableはURLのパスから値を取得するのに対し、@RequestParamはクエリパラメータ(?param=valueの形式)から値を取得します。

@GetMapping("/users")
public ResponseEntity<User> getUserByEmail(@RequestParam String email) {
    User user = userService.findByEmail(email);
    return ResponseEntity.ok(user);
}

/users?email=test@example.comのようにクエリパラメータを使ってリクエストを送信するのが@RequestParamの使い方です。

@RequestParamについての詳しい説明はこちら↓↓

@PathVariableの引数と属性

@PathVariableにはいくつかの便利な引数があります。これを理解することで、より細かくコントローラーの挙動を制御できます。

name属性
name属性を使って、パス変数の名前を明示的に指定することができます。

@GetMapping("/users/{userId}")
public ResponseEntity<User> getUser(@PathVariable(name = "userId") Long id) {
    return ResponseEntity.ok(userService.findById(id));
}

この場合、URLパス内ではuserIdという名前ですが、メソッド引数ではidとして扱っています。

required属性
先ほど説明したように、required属性を使うことでパス変数の必須・オプションを設定できます。

@GetMapping("/users/{userId}")
public ResponseEntity<User> getUser(@PathVariable(required = false) Long userId) {
    // 処理内容
}

required = falseを指定することで、パス変数が存在しない場合にも対応可能です。

    @PathVariableの応用【応用編】

    パス変数に正規表現を使用

    @PathVariableは正規表現を使って、パス変数に対する制約を設定することができます。以下の例では、ユーザーIDに数字のみを許可する正規表現を使用しています。

    @GetMapping("/users/{id:[0-9]+}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        return ResponseEntity.ok(userService.findById(id));
    }

    ここでは、{id:[0-9]+}とすることで、idに数字のみが入ることを強制しています。もし数字以外が入った場合、リクエストは404エラーを返します。

    パス変数を使った動的なリクエスト処理

    動的にパスの構成を変更する場合にも、@PathVariableは非常に役立ちます。例えば、リソースごとに処理を分岐させるケースです。

    @GetMapping("/{resource}/{id}")
    public ResponseEntity<?> getResource(@PathVariable String resource, @PathVariable Long id) {
        switch (resource) {
            case "users":
                return ResponseEntity.ok(userService.findById(id));
            case "products":
                return ResponseEntity.ok(productService.findById(id));
            default:
                return ResponseEntity.notFound().build();
        }
    }

    このように、URLパス内のリソース名に基づいて、異なるサービスを呼び出すことができます。リクエストの柔軟性が向上します。

    おわりに

    @PathVariableは、REST API開発において非常に重要なアノテーションです。動的なURLパラメータの処理をシンプルに実装でき、APIの柔軟性を高めることができます。今回は基本的な使い方から応用的な例まで紹介しましたので、ぜひ実際にコードを書いて試してみてください!

    もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。

    他の記事が見たい方はこちら!↓↓↓

    タイトルとURLをコピーしました