0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spring Bootでクエリパラメータを受け取り方まとめ(@RequestParam/@ModelAttributeなど)

Last updated at Posted at 2025-06-27

はじめに

Webアプリ開発をしている際に、クエリパラメータの受け取り方で質問を受けました。その際に調べて色々分かったことがあったので記事にしようと思います。

クエリパラメータの受け取り方

  • クエリパラメータの受け取り方には@RequestParam@ModelAttributeなどいくつか種類があるため順番に解説しようと思います

@RequestParam

まず1つ目に@RequestParamです。これが1番デフォルトで分かりやすいかなと思います。
クエリパラメータを受け取るのはControllerクラスだと思うので例に出して解説します。

  • クエリパラメータが1つの場合
java
@RestController
class ProductController{
    /**
     * 商品一覧取得の処理
     *
     * @param  検索ワード
     * @return 検索結果
    /
    public List<Product> getAll (@RequestParam String query) {
        //〜コントローラーの処理〜
    }
}

以上のように、メソッドの引数に@RequestParamで指定することで
GET http://localhost:8080/products?query=キーボードクエリパラメータ
として指定されたキーボードが引数の変数queryに入る形となります。

  • クエリパラメータが複数の場合
    複数の場合にも基本的に書き方は同じなのですが、少しだけ書き加えることがあるのでサンプルコードを見てみてください
java
@RestController
class ProductController{
    /**
     * 商品一覧取得の処理
     *
     * @param  検索ワード
     * @param  色の検索ワード
     * @return 検索結果
    /
    public List<Product> getAll (@RequestParam(value = "query") String query, 
                                @RequestParam(value = "color") String color) {
        //〜コントローラーの処理〜
    }
}

以上のように2つクエリパラメータがあった場合、GET http://localhost:8080/products?query=キーボード&color=赤⇦URLのクエリパラメータをどの変数に入れれば良いか判断してくれないので明示的に書いてあげる必要があります。そのときにvalue属性を使い指定していきます。

@ModelAttribute

次に@ModelAttributeを使うパターンです。どのようなときに使うかですが、ずばり「オブジェクトで受け取るとき」です。言葉よりコードを見たほうが早いと思うのでサンプルコードを見てみてください。

java
class Product{
    //商品名
    private String query;
    //色
    private String color;
    
    //以下getter/setter
}
java
@RestController
class ProductController{
    /**
     * 商品一覧取得の処理
     *
     * @param  検索ワード
     * @return 検索結果
    /
    public List<Product> getAll (@ModelAttribute Product product) {
        //〜コントローラーの処理〜
    }
}

GET http://localhost:8080/products?query=キーボード&color=赤
以上のように1つ目のクラスで商品のオブジェクトを用意します。2つ目のクラスで引数をオブジェクトに変えました。これでクエリパラメータが複数あっても、オブジェクトの変数名とURLでの名前が一致していれば、入れることができます。注意点は、オブジェクトの変数名とURLでの名前が一致していないといけないことです。

@ModelAttributeをつけないパターン

java
@RestController
class ProductController{
    /**
     * 商品一覧取得の処理
     *
     * @param  検索ワード
     * @return 検索結果
    /
    public List<Product> getAll (Product product) {
        //〜コントローラーの処理〜
    }
}

以上のように、オブジェクトで受け取る場合、@ModelAttributeを省略することができます。
ここで、省略できるなら書く必要なくなるじゃん!と思うかもしれません。たしかに付けなくても動くので、省略しても基本的に問題はないです。ですが、付けたほうが挙動の確実性を保証してくれますし、可読性も高いです。公式でも付けることが推奨されているので、思わぬ不具合を起こさないためにも付けることをおすすめします。省略できることも知識としては覚えておくと良いと思います。

まとめ

これまでの通り、クエリパラメータを受け取る方法はいくつか種類があり、オブジェクトにするかしないかで大きく変わります。この記事で使い方の違いをはっきりと理解してくれたら嬉しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?