@PathVariableって?
@PathVariable
は、
「URLパスの一部を変数として扱うためのアノテーション」
です。
たとえば、URLに含まれるIDやユーザー名などの動的な部分を抽出し、それをコントローラーのメソッドに引き渡すことができます。これにより、リクエストURLに応じたデータ処理を行うことが可能になります。
基本的には、RESTful API開発で頻繁に使用され、GET
やDELETE
などの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つのパス変数userId
とorderId
を使用しています。リクエストURLが/users/1/orders/100
のようになっている場合、それぞれuserId
に1
、orderId
に100
がマッピングされます。
複数のパス変数を使用することで、より細かい情報をリクエスト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公式ドキュメントを見てみてくださいね。
他の記事が見たい方はこちら!↓↓↓