home wiki.fukuchiharuki.me
Menu

キーワード

  • Spring Boot
  • 入力チェック

したいこと

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

-- 2018/02/14 追記

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

  • 本編の処理の中でサービスとして実装した突合チェックを呼んで、
  • 突合チェックはエラーなら例外を投げるようにする。
  • controllerでそれを拾ってBindingResultにrejectValueする

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

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

-- 追記おわり

どうやって

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

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

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

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

参考