1

Spring3.1とHibernateバリデーター4.2を使用しています。休止状態の検証が2回呼び出されることを確認しました。1つはコントローラーレベルで、次のようなメソッドを使用する場合です。

 @RequestMapping(method = RequestMethod.POST)
    public String onSubmit(@Valid User user, BindingResult result) {....}

そして、エンティティが次の一部として永続化される2回目:

org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(..)
org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreUpdate(..)
org.hibernate.action.EntityUpdateAction.preUpdate(..)

コントローラレベルで有効にして、エラーメッセージ付きのエラーページを表示する方が理にかなっていると思います。そしてとにかく、フローで同じ検証を2回行うのは良くありません。hibernate.validator.autoregister_listenershibernate docで、hibernate構成でfalseに設定することでオフにできることがわかりましたが、お勧めしません。

では、検証に推奨されるアプローチは何ですか?confirmPasswordまた、私の特定のケースでは、ユーザーがフォームを送信するときに検証に必要ですが、テーブルには必要ないフィールド''があるため、2番目の検証で問題が発生します。したがって、ユーザーを保存、更新する必要がある場合は、confirmPassword作成するためだけにフィールドを不必要に設定する必要があります。検証パス。

4

2 に答える 2

1

見た目とは裏腹に、検証は簡単なことではありません。

フロントエンドの検証は、フォームに入力するユーザー向けであり、ビューから別のビューに変更される可能性があります (たとえば、異なるメッセージ)。ビューの必須フィールドのメッセージは、エンティティが永続化されている場合、バックエンドでは「フィールドは必須です!」である必要があります:「フィールドを null にすることはできません」。

バックエンドの検証は、クラスが保存されるときに常に発生する必要があります。実際には、ビューから渡されずに永続エンティティを保存できることを考慮してください (たとえば、Web サービスまたはキューまたは別のソースからデータを受信するバッチから..)。

エンティティ レベルで検証注釈を配置すると、クラスがビューで使用されているかどうかに関係なく、そのクラスに契約が適用されます。

ConfirmPassword はビュー フィールドであるため、エンティティ内のフィールドとして存在するべきではないと思います (たとえば、JSF で同様のケースを開発しました。confirmPassword をエンティティではなく、そのビューに関連する ManagedBean に配置します。エンティティにはのみが含まれます)。パスワード フィールド)。

要約すると、「同じ」検証を2回行うのは正しいと思います。

于 2012-09-24T14:47:22.183 に答える
0

すべてはユースケースに依存し、ある程度は個人の好みに依存します。@obe6 は、場合によっては役立つかもしれないが、他の場合には役に立たないかもしれない 2 つの別個の Bean を提案します。confirmPasswordフィールドに関しては、値が永続化されないように、エンティティで常に@Transientとしてマークできます。

個人的には、標準ではないため、@Valid を介して Spring 検証を無効にすることになるでしょう。一方、JPAライフサイクルイベントでのBean Validationは. これは好みの問題だと思います。ただし、両方を持つことは不要に思えます。

于 2012-09-25T08:08:11.767 に答える