Open2

SpringBootで選択した明細行だけバリデーションしたい

ピン留めされたアイテム
mIO1000mIO1000

やりたいこと

一覧更新系の画面で、選択した行だけ更新する仕様のときに、選択した行だけバリデーションをしたい。

ポイント

  • @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;
}

実装全体コード

https://github.com/mIO1000-g/webappSampleSpringBoot