home wiki.fukuchiharuki.me
Menu

キーワード

  • Spring Boot
  • 入力チェック

したいこと

データベース上のデータと突き合わせてテストしたい。

どうやって

  • アプリケーションサービスとして実装する

のがいいんじゃないかと思う。

@Service
public class UserPasswordCheck {

	@Transactional(readOnly=true)
	public void checkCurrentPassword(
			BindingResult result, 
			String field, 
			Password currentPassword, 
			User user
	) {
		if (result.hasFieldErrors(field)) return;
		boolean isPass = user.getEncryptedPassword().isSame(currentPassword);
		if (! isPass) result.rejectValue(field, メッセージキー);
	}

}

Controller側では次のようにする想定。

// result: ハンドラの引数にするBindingResult
// "currentPassword": 項目名
// newPassword: 入力の値
// user: ログインユーザー
userPasswordCheck.checkCurrentPassword(result, "currentPassword", newPassword, user)
if (result.hasErrors()) return 入力ページのテンプレート;

ノート

Service側でresult.hasFieldErrors(field)するのは、

  • 単項目チェックと相関項目チェックをパスした場合だけチェックしたいから

if (result.hasErros())の前にServiceを呼ぶのは、

  • 突合チェックと他の項目の単項目チェックと相関項目チェックを併せてしたいから

参考