
こんにちは!今回は、Spring Frameworkでクエリパラメータを取得するために使用されるアノテーション、@RequestParamについて詳しく解説します。@RequestParamを使えば、URLに含まれるパラメータを簡単に取得し、サーバー側でリクエスト処理を行うことができます。
@RequestParamとは?
@RequestParamとは、
「HTTPリクエストのURLに含まれるクエリパラメータをメソッドの引数として取得する」
のことができるアノテーションです。
例えば、URLを見たときに、「example.com?id=3」のように「?」が入っている場合があります。
この場合、idという名前のフィールドに3という値を入れて画面を表示しているのです。
これをクエリパラメータといい、それを受け取るために、@RequestParamを使用します。
基本的な使い方
まず、簡単なコード例を見てみましょう。以下は、クエリパラメータとして渡されたユーザー名を取得し、それを使って挨拶メッセージを生成する例です。
サーバー側のコード
@GetMapping("/greet")
public String greetUser(@RequestParam String name) {
return "Hello, " + name + "!";
}このコードでは、@RequestParamアノテーションを使ってnameパラメータを取得し、メソッド内で利用しています。クエリパラメータnameがURLに含まれている場合、その値がgreetUserメソッドのname引数に渡されます。
クライアント側のリクエスト
GET http://localhost:8080/greet?name=John上記のリクエストを送信すると、レスポンスとして "Hello, John!" が返されます。
@RequestParamのオプション
@RequestParamには、オプションで指定できる属性がいくつかあります。それぞれの使い方を詳しく見ていきましょう。
1. value属性
value属性は、リクエストパラメータの名前を指定するために使用されます。デフォルトでは、引数名と同じ名前のパラメータが期待されますが、value属性を使うことで異なる名前のパラメータをマッピングすることができます。
@GetMapping("/search")
public String searchProduct(@RequestParam(value = "query") String productName) {
return "Searching for: " + productName;
}この場合、クエリパラメータとしてqueryを指定すると、メソッドのproductName引数に値が渡されます。
GET http://localhost:8080/search?query=laptop結果: "Searching for: laptop" が返されます。
2. required属性
required属性は、パラメータが必須かどうかを指定するために使用します。デフォルトでは、trueに設定されているため、パラメータが渡されないとエラーが発生します。しかし、required = falseに設定することで、パラメータが渡されなかった場合でもエラーにならず、代わりにデフォルトの処理を行うことができます。
@GetMapping("/greet")
public String greetUser(@RequestParam(value = "name", required = false) String name) {
if (name == null) {
return "Hello, Guest!";
}
return "Hello, " + name + "!";
}nameパラメータが提供されない場合は、「Guest」として扱われます。
GET http://localhost:8080/greet結果: "Hello, Guest!"
3. defaultValue属性
defaultValue属性は、パラメータが提供されなかった場合に使用されるデフォルトの値を設定するために使用します。これにより、nullチェックを省略でき、簡潔なコードを書くことができます。
@GetMapping("/greet")
public String greetUser(@RequestParam(value = "name", defaultValue = "Guest") String name) {
return "Hello, " + name + "!";
}
この場合、nameパラメータが無い場合でも、自動的に「Guest」というデフォルトの値が使用されます。
GET http://localhost:8080/greet結果: "Hello, Guest!"
複数のクエリパラメータの取得
@RequestParamを使って複数のパラメータを取得することも可能です。たとえば、ページネーションのような場面で、ページ番号や表示件数をクエリパラメータとして渡すことが一般的です。
@GetMapping("/products")
public String getProducts(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "size", defaultValue = "10") int size) {
return "Displaying page " + page + " with " + size + " products per page.";
}この例では、pageとsizeの2つのクエリパラメータを取得し、それに基づいて出力メッセージを生成しています。
GET http://localhost:8080/products?page=2&size=5結果: "Displaying page 2 with 5 products per page."
Listや配列としてクエリパラメータを取得する
複数の同じ名前のパラメータをリクエストに含める場合、@RequestParamを使ってListや配列として値を取得することができます。
@GetMapping("/filter")
public String filterProducts(@RequestParam List<String> categories) {
return "Filtering by categories: " + String.join(", ", categories);
}
クライアントが複数のカテゴリーをフィルタリングしたい場合、以下のようにリクエストを送信します。
GET http://localhost:8080/filter?categories=electronics&categories=books結果: "Filtering by categories: electronics, books"
@RequestParamを使った応用例
ここでは、@RequestParamの応用的な使い方をいくつか紹介します。
1. オブジェクトにマッピング
クエリパラメータが複数あり、それらを一つのオブジェクトにマッピングしたい場合、@ModelAttributeアノテーションを使うことができます。
@GetMapping("/search")
public String searchProducts(@ModelAttribute ProductFilter filter) {
return "Filtering by: " + filter.toString();
}この例では、ProductFilterというクラスにクエリパラメータが自動的にバインドされます。
2. パラメータのバリデーション
@RequestParamを使ってバリデーションを行うことも可能です。たとえば、@Validアノテーションとカスタムバリデータを組み合わせて入力を検証できます。
@GetMapping("/register")
public String registerUser(@RequestParam @NotEmpty String email,
@RequestParam @Size(min = 6) String password) {
return "User registered with email: " + email;
}このコードでは、emailが空でないこと、passwordが6文字以上であることを検証しています。検証に失敗すると、例外がスローされます。
@RequestParamの引数
@RequestParamでは、いくつかの引数を指定することができます。これにより、リクエストのパラメータを柔軟に扱うことが可能です。
1. value属性
value属性は、対応するリクエストパラメータの名前を指定します。
2. required属性
required属性で、パラメータが必須かどうかを指定します。
3. defaultValue属性
defaultValue属性は、パラメータが存在しない場合に使用されるデフォルト値を設定します。
まとめ
@RequestParamは、クエリパラメータを取得してリクエスト処理を行う上で非常に便利なアノテーションです。クエリパラメータが必須であったり、デフォルト値を設定したりするなど、柔軟なオプションも用意されています。今回の解説を参考にして、ぜひ@RequestParamを活用してみてください!
もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。
他のMappingアノテーションについて知りたい方はこちらもどうぞ!↓↓↓↓
