SpringBootを持ちいてWebアプリを作成しております。
その中でValidationエラー時の画面遷移の実装について迷ってしまいましたので質問いたします。
↓こうしてしまうとシンプルですが、入力エラーで戻った時にURLが変わってしまいます。
Java
1@Controller 2@RequestMapping("sample") 3class SampleController{ 4 5 // こいつはセッションスコープの@Component 6 @Autowired 7 private SampleDate sampleData; 8 9 @Autowired 10 private SampleService service; 11 12 @GetMapping("input") 13 public ModelAndView input(){ 14 return new ModelAndView("input"); 15 } 16 17 @PostMapping("confirm") 18 public ModelAndView confirm(@Validated SampleForm sampleForm, BindingResult bindingResult){ 19 if(bindingResult.hasErrors()){ 20 return new ModelAndView("input"); 21 } 22 sampleData.setSampleForm(sampleForm); 23 return new ModelAndView("confirm"); 24 } 25 26 @PostMapping("complete") 27 public ModelAndView complete(){ 28 servide.exec(sampleData); 29 return new ModelAndView("complete"); 30 } 31}
なのでリダイレクトで戻してやる必要があると思い、しかもエラーの内容は画面に表示してやりたいので、
↓のようにRedirectAttributeを用いてやってみました。
試行錯誤の結果、「BindingResult.MODEL_KEY_PREFIX + モデル名」で渡して、RequestContextUtilsを使うとうまくいったのですが、なんか複雑になってしまいました。
Java
1@Controller 2@RequestMapping("sample") 3class SampleController{ 4 5 // こいつはセッションスコープの@Component 6 @Autowired 7 private SampleDate sampleData; 8 9 @Autowired 10 private SampleService service; 11 12 @GetMapping("input") 13 public ModelAndView input(HttpServletRequest req){ 14 SampleForm form = sampleData.getSampleForm() 15 if(form == null){ 16 form = new SampleForm(); 17 } 18 ModelAndView mav = new ModelAndView("input"); 19 mav.addObject("sampleForm", form); 20 setErrorToModel(req, mav); 21 return mav; 22 } 23 24 @PostMapping("confirm") 25 public ModelAndView confirm(@Validated SampleForm sampleForm, BindingResult bindingResult, RedirectAttribute redirectAttribute){ 26 sampleData.setSampleForm(sampleForm); 27 if(bindingResult.hasErrors()){ 28 ModelAndView mav = new ModelAndView("redirect:./input"); 29 redirectAttribute.addFlashAttributes(BindingResult.MODEL_KEY_PREFIX + "sampleForm", bindingResult); 30 return mav; 31 } 32 return new ModelAndView("confirm"); 33 } 34 35 @PostMapping("complete") 36 public ModelAndView complete(){ 37 service.exec(sampleData); 38 return new ModelAndView("complete"); 39 } 40 41 private void setErrorToModel(HttpServletRequest req, ModelAndView mav) { 42 Map<String, ? > inputFlashMap = RequestContextUtils.getInputFlashMap(req); 43 if (inputFlashMap != null) { 44 inputFlashMap.forEach((k, v) -> mav.addObject(k, v)); 45 } 46 } 47}
URLを変えずにシンプルに実装する方法はないのでしょうか?
こうゆうケースのベストプラクティスが知りたいです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー