3

パスワードのリセットに使用される Spring MVC Web ページがあります。これには、次の検証ワークフローを実行する必要があります。

  1. ユーザー名またはメールアドレスを入力してください
  2. 電子メールが提供されている場合は、有効な形式であることを確認してください (例: @Email)
  3. 次の方法でユーザーが存在することを確認します。

    3a) ユーザー名を介してデータベースからユーザーをロードしようとしています
    3b) ユーザー名によるロードで が返されnullた場合は、電子メールを介してデータベースからユーザーをロードしてみてください

  4. ロード後、ユーザーがロックアウトされていないことを確認します。user.isLocked()

現在、これらの検証はすべてorg.springframework.validation.Validator

ただし、これには、UserServiceユーザーをロードできるように、バリデーターがオブジェクトにアクセスできる必要があります。これにより、ユーザーは 2 回ロードされます。1 回目は my バリデータによって、2 回目は my によってロードされるControllerため、.resetPassword(User).


質問: 項目 3 はどこで確認すればよいですか?

それらの検証は Controller により適していますか? 検証をそのままにしておくと、バリデーターからユーザーを返すことができvoidますか (バリデーター インターフェイスによるメソッドがあります)。

4

3 に答える 3

3

私の意見では、ステップ 3 と 4 はビュー レイヤー (特に、コントローラーによって実行される検証) にはまったく属していません。

これらの手順は、このシナリオのビジネス ロジックの重要な部分であるため、サービス レイヤーに実装する必要があります。

サービス層は次のようなメソッドを提供する必要があります

public void resetPasswordByUsernameOrEmail(String usernameOrEmail) { ... }

これらの手順は、このメソッド内でresetPassword(User).

必要に応じて、例外をスローし、booleanまたはenum(異なるエラー状態を区別したい場合) を返すことにより、コントローラーにこのメソッドの結果を認識させることができます。

于 2013-09-12T15:06:29.643 に答える
2

質問に順番に答えるには:

  1. UserDaoで User の存在を確認する必要があります。
  2. いいえ、これらの検証は Controller 内にあるべきではありません。Controller はバリデーションについて何も知らないはずです。
  3. void を返すメソッドを定義するインターフェイスを使用しているため、User を返したい場合は、次のいずれかを実行する必要があります。
    • Validator 実装で独自のメソッドを作成します。これの欠点は、インターフェイスで定義されていないメソッドに依存するため、ポリモーフィズムを効果的に使用できないことです。
    • 独自の Validatorを作成します (おそらく、Spring の Validator インターフェースを拡張し、必要なメソッドを定義する独自のインターフェースを作成します)。これはおそらく私が選ぶものです。
于 2013-09-12T15:04:54.080 に答える
1

多分それは重複しています:Spring MVC Bean Validation

別の解決策は次のとおりです。

私が取り組んだプロジェクトの 1 つでは、SpringBeanUtil クラスがありました。WebApplicationContext を取得し、静的メソッドを介して必要な Bean を取得します。ちょっと醜いですが、この種の問題に役立ちました。

自己責任で使用してください。

public class SpringBeanUtil implements ApplicationContextAware{

private static ApplicationContext APPLICATION_CONTEXT;

@Override
public void setApplicationContext(ApplicationContext applicationContext)
        throws BeansException {
    APPLICATION_CONTEXT=applicationContext;
}

public static Object getBean(String name){
    return APPLICATION_CONTEXT.getBean(name);
}
public static <T> T getBean(Class<T> type){
    return APPLICATION_CONTEXT.getBean(type);
}
}
于 2013-09-12T15:04:27.467 に答える