Open2
SpringBootで選択した明細行だけバリデーションしたい
ピン留めされたアイテム
やりたいこと
一覧更新系の画面で、選択した行だけ更新する仕様のときに、選択した行だけバリデーションをしたい。
ポイント
- @Validatedで表現できないチェックは、Spring Validatorのメソッドを直接呼び出す方式をとる。
TableUpdateController.java
@Controller
@RequestMapping("/table_update")
public class TableUpdateController {
private static final Logger logger = LoggerFactory.getLogger(TableUpdateController.class);
@Autowired
private SmartValidator smartValidator;
@Autowired
TableUpdateService sv;
@Autowired
private MessageUtil message;
/**
* 確定
* @param form フォームオブジェクト
* @param br BindingResultオブジェクト
* @param model Model
* @param redirect リダイレクトでフラッシュスコープを使うためのオブジェクト
* @return ページ名
*/
@PostMapping("/confirm")
public String confirm(@ModelAttribute(name = "tableUpdateForm") TableUpdateForm form, BindingResult br,
Model model, RedirectAttributes redirect) {
for (int i = 0; i < form.getDetail().size(); i++) {
TableUpdateRecord record = form.getDetail().get(i);
if (record.isChecked()) {
// 選択した行のみ単項目チェック対象とする
// エラー対象のフィールドを設定するために、一時的にパスをプッシュ
br.pushNestedPath("detail[" + i + "]");
// SmartValidatorに、検証対象のオブジェクトを渡す
smartValidator.validate(record, br);
// 追加したパスをリセット
br.popNestedPath();
}
}
logger.debug("エラー件数=" + Integer.toString(br.getErrorCount()));
if (br.hasErrors()) {
// 単項目チェックでエラーが発生した場合
model.addAttribute("message", message.getMessage("WCOM00002", null));
return "table_update";
}
try {
// 確定
sv.confirm(form);
} catch (ApplicationCustomException ex) {
// 業務エラーが発生した場合、メッセージとして返す
model.addAttribute("message", ex.getMessage());
return "table_update";
}
redirect.addFlashAttribute(form);
return "redirect:/table_update/";
}
}
TableUpdateForm.java
@Data
public class TableUpdateForm {
private String employeeId;
private String name;
private boolean gender_m;
private boolean gender_f;
private String enteringYear;
private boolean retired;
private String departmentId;
List<Map<String, String>> departmentList;
private List<TableUpdateRecord> detail;
}
TableUpdateRecord.java
@Data
public class TableUpdateRecord {
private boolean checked;
private String no;
@NotBlank
@Size(max = 10)
private String employeeId;
@NotBlank
@Size(max = 30)
private String name;
@NotBlank
private String gender;
@NotBlank
@DateTimeFormat(pattern = "yyyy-MM-dd")
private String birthday;
@NotBlank
@DateTimeFormat(pattern = "yyyy-MM-dd")
private String enteringDate;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private String retirementDate;
@NotBlank
private String departmentId;
private boolean newLine;
private String updateDate;
}
実装全体コード
参考URL・参考書籍
『Spring徹底入門』