環境
Java(SpringFramework)
Thymeleaf
状況
更新画面でバリデーションエラーにより更新が失敗したというようなケースにおいて、
BuindingResultにFormのエラーを格納して更新画面に戻したが、BuindingResultのエラーが画面に表示されない。
原因
BindingResultはModelに保持されており、保持しているAttributeNameと同じもので上書きされることで消えてしまいます。
以下はエラー時にModelに保持している情報の一部(hogeFormに3つのエラーがあったことを示しています)。
{hogeForm=HogeForm(cd=1, name=, unitPrice=null, version=0), org.springframework.validation.BindingResult.hogeForm=org.springframework.validation.BeanPropertyBindingResult: 3 errors
…
このModelを更新画面に戻す際に、hogeFormを上書きすることでエラーが消えてしまいます。
以下は、DBから取得した結果をViewに渡そうとして上書いてしまった例です。
1 2 |
hogeForm = service.selectOne(hogeForm); model.addAttribute("hogeForm", hogeForm); |
model.addAttribute(“hogeForm”, hogeForm) としている部分で、hogeFormが上書きされてエラーが消えてしまいます。
{materialForm=MaterialForm(cd=1, name=1, unitPrice=1, version=0)}
私の場合、
更新画面を表示するメソッド(DBから取得したデータをFormに格納して表示)を、
エラー時に戻す際にも利用してしまったために起こりました。(凡ミス)
対処方法
エラーで更新画面に戻す場合、POSTされたFormの値を戻すようにすることで解消しました。
(editFormメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@GetMapping(value="/hoge/edit/{cd:.+}") public String getEdit(@ModelAttribute MaterialForm hogeForm, Model model) { hogeForm = service.selectOne(hogeForm); return editForm(hogeForm, model); } @PostMapping("/hoge/update") public String postUpdate(@ModelAttribute @Validated HogeForm form, BindingResult error, Model model) { if(error.hasErrors()) return editForm(form, model); service.update(form); return "redirect:/hoge"; } private String editForm(MaterialForm hogeForm, Model model) { model.addAttribute("form", "hoge_form::hoge_form"); model.addAttribute("hogeForm", hogeForm); return "home/homeLayout"; } |
コメント