質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

4175閲覧

エラーキャッチ時にform情報などを持たせたまま、入力画面に戻したい

v_engineer0

総合スコア4

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2021/01/23 09:30

Java(Spring)初学者です。エラーキャッチ後のハンドリングについて質問です。
入力画面→確認画面→完了画面、と遷移する機能で
確認画面→完了画面の処理時に、入力内容を処理させる外部APIを叩き、正常時はそのまま完了画面に遷移しますが
エラー時は、Controllerのindexでformなど諸々定義された情報(下記Controller参照)を受け渡しつつ、入力画面に戻し、かつエラーメッセージも表示させたいです。

この場合、以下の実現方法を検討していますが、どうもしっくりきません。

①独自のExeptionを作成し、それをキャッチさせ、そのクラスの中で入力画面に戻すよう処理を組み込む。
→単に画面遷移だけであれば、ModelAndViewをnewしてsetViewNameで遷移先を指定すれば良いだけだが
form情報などControllerのindexメソッドでやっている処理ごと受け渡したい。その記述方法が不明。。

②formに新しくエラー表示用の項目を定義("error"とします)し、エラー時に以下を記述(下記error参照)し、バインドエラーとして処理させる。
→バリデーションチェックでもないのに、エラー表示用にしか使わない項目をformに定義して使うこと自体が間違っている気がします。
また、gaibuService.gaibuApi(bindingResult);の処理後、すぐにbindingResult.hasErrors()を再度実行しているのもセンスが無い気がします。。

そもそもこの①、②の検討案自体間違っているかもしれませんが、作法等も含め、何かアドバイスを頂けるとありがたいです。

Controller

1 /** 2 * 入力画面 3 **/ 4 @RequestMapping() 5 public ModelAndView index(@ModelAttribute Form form) { 6 7 List<TestDto> TestDtoList = CommonList.getTestDtoList(); 8 ModelAndView mav = new ModelAndView(); 9 mav.addObject("TestDtoList", TestDtoList); 10 // 検討案②の時、以下を実装し、index.htmlで出力させる 11 mav.addObject("error", error); 12 mav.setViewName("/index"); 13 return mav; 14 } 15 16 /** 17 * 完了画面 18 **/ 19 @RequestMapping(value = complete) 20 public ModelAndView complete(@Validated @ModelAttribute Form form, BindingResult bindingResult) throws Exception { 21 22 // Validation Check 23 if (bindingResult.hasErrors()) { 24 return index(form); 25 } 26 27 // 外部APIを叩く処理。 28 // 正常なら完了画面へ。エラー時はエラーメッセージと一緒に入力画面へ。 29 gaibuService.gaibuApi(bindingResult); 30 if (bindingResult.hasErrors()) { 31 return index(form); 32 } 33 34 ModelAndView mav = new ModelAndView(); 35 mav.setViewName("/complete"); 36 return mav; 37 }

error

1 // エラー(ここではエラーフラグが"1"ならエラーとします) 2 if(errorFlg.equals("1")) { 3 FieldError fieldError = new FieldError(bindingResult.getObjectName(), "error", "表示させたいエラーメッセージ"); 4 bindingResult.addError(fieldError); 5 return; 6 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/01/23 09:39

formをそのままMaVにaddするだけじゃだめなんですか?
v_engineer0

2021/01/23 09:50

独自Exptionのクラスの中で、formで定義されている項目を以下のような感じで一つ一つaddするということでしょうか。 mav.addObject("test01", Form.getTest01); 記載し忘れてしまいましたが、formで定義された項目はprivateで定義されています・・
m.ts10806

2021/01/23 21:35

>独自Exptionのクラスの中で Exception です。 ただ、そのコードが提示されてないと、実装から「対応方法」は誰にも検討できないと思います。
guest

回答1

0

ベストアンサー

入力→確認→完了画面のように入力内容を保持・伝搬させる場合、1つの方式として、セッション属性を利用します。
以下のように入力内容を格納するオブジェクト(ここではSampleFormとします)を用意し、

java

1package com.github.apz.controller.confirm; 2 3import java.io.Serializable; 4 5import javax.validation.constraints.NotNull; 6 7import lombok.Getter; 8import lombok.Setter; 9 10@Getter @Setter 11public class SampleForm implements Serializable { 12 @NotNull 13 private String name; 14}

ControllerにてSampleFormをセッション属性として利用するよう宣言します。

java

1package com.github.apz.controller.confirm; 2 3import org.springframework.stereotype.Controller; 4import org.springframework.validation.BindingResult; 5import org.springframework.validation.FieldError; 6import org.springframework.validation.annotation.Validated; 7import org.springframework.web.bind.annotation.GetMapping; 8import org.springframework.web.bind.annotation.ModelAttribute; 9import org.springframework.web.bind.annotation.PostMapping; 10import org.springframework.web.bind.annotation.RequestMapping; 11import org.springframework.web.bind.annotation.SessionAttributes; 12import org.springframework.web.servlet.ModelAndView; 13 14import com.github.apz.service.ConfirmSampleService; 15 16import lombok.RequiredArgsConstructor; 17 18@Controller 19@RequestMapping("/confirm") 20@SessionAttributes("form") 21@RequiredArgsConstructor 22public class ConfirmSampleController { 23 24 private final ConfirmSampleService service; 25 26 @ModelAttribute(name = "form") 27 public SampleForm form() { 28 return new SampleForm(); 29 } 30 31 @GetMapping("") 32 public ModelAndView display(ModelAndView mnv, @ModelAttribute("form") SampleForm form) { 33 mnv.setViewName("confirm/input"); 34 return mnv; 35 } 36 37 @PostMapping("confirm") 38 public ModelAndView confirm(ModelAndView mnv, @ModelAttribute("form") @Validated SampleForm form, BindingResult bindingResult) { 39 if (bindingResult.hasErrors()) { 40 mnv.setViewName("confirm/input"); 41 return mnv; 42 } 43 mnv.setViewName("confirm/confirm"); 44 return mnv; 45 } 46 47 @PostMapping("complete") 48 public ModelAndView complete(ModelAndView mnv, @ModelAttribute("form") @Validated SampleForm form, BindingResult bindingResult) { 49 50 if (! service.test(form.getName())) { 51 FieldError fieldError = new FieldError("form", "name", form.getName(), true, null, null, "capybaraから始まっていません。"); 52 bindingResult.addError(fieldError); 53 mnv.setViewName("confirm/input"); 54 return mnv; 55 } 56 57 mnv.setViewName("confirm/complete"); 58 return mnv; 59 } 60 61} 62

なお、ここで定義しているConfirmSampleServiceは以下です。

java

1package com.github.apz.service; 2 3import org.springframework.stereotype.Service; 4 5@Service 6public class ConfirmSampleService { 7 public boolean test(String name) { 8 return name.startsWith("capybara"); 9 } 10} 11

FieldErrorの作成については、以下の公式ドキュメントの日本語訳を参照してください。上記のサンプルコードでは便宜上nullで定義している内容は、エラーコードとエラーメッセージ用の設定を省略しています。

https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/FieldError.html

投稿2021/01/24 00:42

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

v_engineer0

2021/02/11 08:07

返信遅れまして申し訳ありませんでした! 教えていただいた方法で解決致しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問