SpringのredirectAttributesとは?エラーハンドリング時にメッセージをリダイレクトで渡す方法
新人
「Springでフォーム送信後にリダイレクトすることが多いですが、エラーが起きたときにメッセージを渡したい場合はどうすればいいですか?」
先輩
「その場合はredirectAttributesを使うのが定番ですね。Spring MVCのリダイレクト処理に適した仕組みです。」
新人
「それってFlash属性ってやつですか?なんだか難しそうです……」
先輩
「安心して。初心者でも使えるように、ゆっくり丁寧に解説するよ。まずはredirectAttributesが何なのかから見ていこう!」
1. redirectAttributesとは?
redirectAttributesは、Spring Frameworkの@Controllerでリダイレクト処理を行う際に、一時的なメッセージや値を次のリクエストに渡すための仕組みです。エラーメッセージや成功メッセージなどをリダイレクト先の画面に表示したいときに非常に便利です。
通常、リダイレクトするとリクエストスコープの値は失われてしまうため、別のリクエストに値を渡すには一工夫が必要です。redirectAttributesを使うことで、値をFlash属性として一時的に保持し、リダイレクト先に受け渡すことができます。
このFlash属性は、セッションを使って短期間だけデータを保持し、次のリクエストで自動的に削除されるため、セッションを汚さず安全に使えるのが特徴です。
Spring MVCにおけるリダイレクト処理とメッセージの受け渡しは、「画面遷移後に一度だけ表示するメッセージ」という場面でとてもよく使われています。
2. なぜエラー後にメッセージを渡す必要があるのか?
Webアプリケーションを使っていて、ボタンを押したあとに「エラーが発生しました」「入力内容を確認してください」などのメッセージが表示されることがありますよね。これはユーザーに対して処理の結果を伝えるために欠かせないフィードバックです。
特にフォーム送信後にエラーが発生した場合、再度入力画面に戻ったときに何が問題だったのかをユーザーに伝えなければ、混乱してしまいます。ユーザー体験の向上という観点でも、適切なメッセージ表示は重要です。
Springでは、バリデーションや例外処理を行ったあと、redirect:で別のページに遷移することが多いです。このとき、ただ単にリダイレクトするだけでは、何が起きたのかがユーザーに伝わりません。
そこで登場するのがredirectAttributesです。これを使うことで、エラーの内容や補足の案内文をリダイレクト先に渡し、画面上に表示することができます。
例えば、次のようなケースで役立ちます:
- 会員登録フォームでバリデーションエラーが発生した場合
- ログインに失敗したときのエラーメッセージ表示
- データベース保存処理中の例外発生時の通知
このように、redirectAttributesを使えば、リダイレクト処理の中でもスマートにメッセージを渡すことができ、「エラーハンドリング」と「ユーザーへの情報伝達」の両方を実現できます。
次回は実際にSpringの@Controllerを使ったコード例で、redirectAttributesをどう使うかを見ていきましょう。
3. redirectAttributesを使うためのControllerの書き方
それでは実際に、Springの@ControllerでredirectAttributesを使ったリダイレクト処理の記述方法を見ていきましょう。ここでは、フォームの内容を受け取って、エラーがあればメッセージをリダイレクト先に渡す例を取り上げます。
以下は、ユーザー登録処理の一部として、名前の入力チェックを行い、空欄だった場合にエラーメッセージをリダイレクトで渡す実装です。
@Controller
public class UserController {
@PostMapping("/register")
public String register(
@RequestParam("name") String name,
RedirectAttributes redirectAttributes) {
if (name == null || name.trim().isEmpty()) {
redirectAttributes.addFlashAttribute("errorMessage", "名前は必須項目です。");
return "redirect:/register-form";
}
// ユーザー登録処理(省略)
redirectAttributes.addFlashAttribute("successMessage", "登録が完了しました。");
return "redirect:/register-complete";
}
@GetMapping("/register-form")
public String showForm() {
return "register-form";
}
@GetMapping("/register-complete")
public String showComplete() {
return "register-complete";
}
}
この例では、名前が空欄だった場合にredirect:/register-formへ戻りつつ、errorMessageというキーでメッセージを渡しています。逆に正常に登録できた場合にはsuccessMessageというキーで完了メッセージを渡しています。
addFlashAttributeメソッドを使うことで、Flash属性としてメッセージを一時的に保存し、次のリクエストでのみ利用できます。セッションに長期間データを保持せずに済むため、セッションの肥大化を防げるというメリットもあります。
4. リダイレクト時にメッセージを渡す具体的なコード例
ここでは、エラーハンドリングや登録完了など、様々なケースでredirectAttributesを使ってメッセージを渡す方法をもう少し詳しく解説します。
下記は、よくある「削除処理」でのリダイレクトメッセージの例です。ユーザーを削除する処理で、存在しないIDが指定されたときにエラーを返し、正常に削除できた場合は完了メッセージを返します。
@Controller
public class AdminController {
@PostMapping("/user/delete")
public String deleteUser(
@RequestParam("id") Long id,
RedirectAttributes redirectAttributes) {
boolean deleted = deleteUserById(id); // 仮の削除処理
if (!deleted) {
redirectAttributes.addFlashAttribute("errorMessage", "指定されたユーザーは存在しません。");
return "redirect:/user-list";
}
redirectAttributes.addFlashAttribute("successMessage", "ユーザーを削除しました。");
return "redirect:/user-list";
}
private boolean deleteUserById(Long id) {
// 実際の削除処理をここに実装(例:サービス呼び出し)
return false; // 仮に常に失敗する処理
}
}
このように、redirectAttributesを使うことで、リダイレクト時に失敗メッセージも成功メッセージも柔軟に渡すことができます。リダイレクト後の画面に必要な情報だけを一時的に表示したいときに非常に便利です。
リダイレクト先のHTMLテンプレート(例:Thymeleafなど)で、errorMessageやsuccessMessageが存在しているかどうかをチェックし、あれば表示するようにすると自然な動作になります。
以下は、Thymeleafでメッセージを表示する例です。
<!-- register-form.htmlやuser-list.html内に設置 -->
<div th:if="${errorMessage}" class="text-danger">
<p th:text="${errorMessage}"></p>
</div>
<div th:if="${successMessage}" class="text-success">
<p th:text="${successMessage}"></p>
</div>
上記のような記述をテンプレートに入れておけば、Controller側でredirectAttributesを使って渡したメッセージを画面に反映できます。
この仕組みは、画面の再読み込みやF5リロードでメッセージが消えるという仕様になっており、意図しない二重送信や重複処理を防ぐ意味でも有効です。
また、画面遷移の流れの中で一度だけ表示したい注意喚起やガイドなどにも応用できます。
たとえば:
- ログイン直後の「ようこそ◯◯さん」などの挨拶メッセージ
- 購入完了画面での「ご注文ありがとうございました」などの通知
- フォーム送信後にだけ表示したい警告メッセージ
このような場面で、redirectAttributesはユーザーとのやり取りをよりスムーズにする役割を果たします。
5. メッセージの受け取り側(リダイレクト先のControllerやHTML)の書き方
redirectAttributesを使ってメッセージを渡したあとは、リダイレクト先の画面でそのメッセージを受け取って表示する必要があります。受け取り側では、SpringのテンプレートエンジンであるThymeleafを使うことが一般的です。
リダイレクト先のControllerでは、特に何も設定する必要はありません。addFlashAttributeで渡した値は自動的に次のリクエストに渡されるからです。大切なのは、HTMLのテンプレートファイル側で適切にその値を表示する処理を書くことです。
以下は、リダイレクト後のHTMLでエラーメッセージや成功メッセージを表示する簡単なコードです。
<!-- register-form.html や user-list.html など -->
<div th:if="${errorMessage}">
<p th:text="${errorMessage}"></p>
</div>
<div th:if="${successMessage}">
<p th:text="${successMessage}"></p>
</div>
このように書いておくことで、Controllerで設定したFlash属性がリダイレクト後の画面に一度だけ表示されます。次のリクエストでは自動的に消えるため、セッションの管理も楽になります。
また、複数のメッセージを扱いたい場合は、Mapのような構造で渡してループで表示することもできます。ただし、初心者向けの基本的な実装では、まずは上記のように1つずつ扱うのが分かりやすいでしょう。
6. よくある失敗とその対処法(メッセージが表示されないなど)
redirectAttributesを使うと便利ですが、初心者がよくつまずくポイントもあります。ここでは代表的な失敗例とその対処法を紹介します。
① Flash属性を使わずにaddAttributeを使ってしまう
addAttributeはURLのクエリパラメータとして値を付け加えるだけです。そのため、画面でエラーメッセージを表示したい場合には使えません。メッセージの表示にはaddFlashAttributeを使いましょう。
// NG: URLに?errorMessage=...と付くだけで、テンプレートに表示できない
redirectAttributes.addAttribute("errorMessage", "エラーが発生しました");
// OK: Flash属性として一時的に保存し、画面で表示可能
redirectAttributes.addFlashAttribute("errorMessage", "エラーが発生しました");
② HTML側でth:ifとth:textを忘れている
ControllerでFlash属性を設定していても、HTML側で表示の処理がなければ画面にメッセージは出ません。必ずth:ifとth:textで受け取りましょう。
③ リダイレクトしていない(forwardやreturn viewNameのまま)
redirectAttributesは、リダイレクト時に使う仕組みです。そのため、forwardや直接ビュー名を返すような場合は、値が渡りません。リダイレクトを明示的に書きましょう。
// NG: 画面は遷移するが、Flash属性は使えない
return "register-form";
// OK: リダイレクトされることでFlash属性が有効になる
return "redirect:/register-form";
④ セッションが無効になっている(開発環境の設定など)
Flash属性はセッションを一時的に使ってデータを保持しています。そのため、Springの設定やブラウザの挙動によってセッションが無効化されていると、値が渡らないことがあります。
特に、Chromeのプライバシーモードやクッキーの制限設定などにより、セッションが機能しないこともあるので注意が必要です。
7. redirectAttributesを使うメリットと注意点
redirectAttributesを使う最大のメリットは、リダイレクト後の画面に一度だけ情報を渡せるという点です。これにより、ユーザーに対して的確なフィードバックを行うことができ、ユーザー体験を向上させることができます。
また、Flash属性は自動的にセッションから削除されるため、長期的にセッションに値を残してしまうという心配もなく、アプリケーションのメモリ管理にも優れています。
リダイレクト処理は以下のような場面でよく使われます:
- フォーム送信後に画面を更新して、F5キーの再送信を防止する
- バリデーションエラー時に入力画面に戻す
- 削除や登録などの完了メッセージを一度だけ表示する
これらの処理と組み合わせることで、アプリケーションの完成度が大きく向上します。
ただし、前述のようにredirectAttributesはredirect:とセットで使うこと、そしてHTML側でメッセージを表示する記述を忘れないことが重要です。少しでも条件がそろっていないと、メッセージが表示されず「なぜか動かない」と感じてしまう原因になります。
最後に、Springでのリダイレクト処理とエラーハンドリングをスマートに行うために、redirectAttributesは非常に強力な武器になります。初心者の方でも、使い方を理解すれば簡単に導入できますので、ぜひ実際のプロジェクトで活用してみてください。