キーワード

したいこと

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

-- 2018/02/14 追記

BindingResultをサービスにまで持っていくのはよくない気がする。あと、本編の処理とトランザクションが別なのも厳密にはよくない。ので、

のがいいんじゃないかな。

ああ、そうそう、単項目チェックと突合チェックを同時にフィードバックしたいから本編の処理に入れられなかったんだった。そういうのがなければ上記のようにした方がシンプルでよろしい、のだと思う。

-- 追記おわり

どうやって

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

@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を呼ぶのは、

参考

Last-modified: 2018-02-14 (水) 16:22:39 (585d)