Spring Bootのクエリ・フォーム・パスの値を配列・リスト・Mapで受け取る方法
生徒
「Spring BootでフォームやURLから値を受け取るとき、配列やリストでまとめて受け取ることってできますか?」
先生
「はい、Spring Bootではクエリパラメータやフォーム、パス変数から配列やリスト、さらにはMap形式で値を受け取ることができますよ。」
生徒
「やり方が複雑そうですね…。初心者でもわかるように教えてほしいです!」
先生
「もちろんです。実際の使い方を順番に見ていきましょう!」
1. クエリパラメータをListや配列で受け取る方法
Spring Bootでは、URLのクエリパラメータを配列やリストとして受け取ることができます。複数の値を同じキーで渡すと、それを配列やListにバインドしてくれます。
たとえば以下のようなURLを想定します:
http://localhost:8080/search?tag=java&tag=spring&tag=boot
このとき、Controllerでは次のように記述します:
@GetMapping("/search")
public String search(@RequestParam List<String> tagList) {
System.out.println(tagList);
return "searchResult";
}
あるいは配列で受け取ることも可能です:
@GetMapping("/search")
public String search(@RequestParam String[] tag) {
for (String t : tag) {
System.out.println(t);
}
return "searchResult";
}
このように、クエリパラメータに同じキーを複数指定すれば、自動的にListや配列にバインドされます。
2. フォームデータを配列・リストで受け取る方法
フォームのチェックボックスや複数選択の値も、Spring Bootでは配列やListでバインド可能です。
以下はHTML側のサンプルです:
<form method="post" action="/submit">
<input type="checkbox" name="hobby" value="読書">読書<br>
<input type="checkbox" name="hobby" value="映画">映画<br>
<input type="checkbox" name="hobby" value="旅行">旅行<br>
<button type="submit">送信</button>
</form>
Controllerでは次のように受け取れます:
@PostMapping("/submit")
public String submit(@RequestParam List<String> hobby) {
System.out.println("趣味: " + hobby);
return "result";
}
このように、@RequestParamを使うだけで配列・リストに自動的に変換されます。
3. パス変数から複数値を受け取る方法(PathVariableの応用)
通常、@PathVariableでは単一の値を受け取りますが、区切り文字(例:カンマ)を使えば複数値を一括で受け取ることができます。
http://localhost:8080/user/1,2,3
Controller側では次のように対応できます:
@GetMapping("/user/{ids}")
public String getUsers(@PathVariable String ids) {
List<String> idList = Arrays.asList(ids.split(","));
System.out.println("IDリスト:" + idList);
return "userList";
}
split()で分割すれば、柔軟にリスト化できます。
4. クエリやフォームからMapで値を受け取る方法
動的なパラメータをまとめて受け取りたい場合は、Mapでのバインドが便利です。
以下のようなフォームがあるとします:
<form method="post" action="/profile">
<input type="text" name="name" value="田中"><br>
<input type="text" name="email" value="tanaka@example.com"><br>
<button type="submit">送信</button>
</form>
Controller側でMapにまとめて受け取るには:
@PostMapping("/profile")
public String handleProfile(@RequestParam Map<String, String> formData) {
System.out.println(formData);
return "profileResult";
}
@RequestParam Map<String, String>を使うことで、パラメータをまとめて扱うことができます。
5. 配列・リスト・Mapのバインドの違いと使い分け
Spring Bootで配列・List・Mapを使い分けるポイントは以下の通りです。
- 配列:項目数が決まっている場合に使いやすい。
- List:柔軟に可変長のデータを扱いたいときに最適。
- Map:キーと値のペアで扱いたい場合や、動的な項目に対応したいときに便利。
バインドの仕組みを理解しておくことで、Spring Bootのフォーム処理やREST API開発が非常にスムーズになります。
6. バインドできないときの注意点とエラー対処法
バインドに失敗するよくある原因としては、以下のようなものがあります:
- HTMLの
name属性がControllerと一致していない - 配列名やリスト名のスペルミス
- URLのクエリ形式が正しくない(例:
param[]=1のような書き方)
特に、@RequestParamの指定が抜けていると400 Bad Requestになりやすいため、注意しましょう。