1

@NotEmptyHibernate Validator を使用しているときに、およびアノテーションが によって返される配列に@NotNull重複したメッセージを生成することに気付きました。InvalidValuegetInvalidValues(...)

のようなメッセージを指定すると@NotEmpty(message = "My error message.")、「My error message.」という InvalidValue が 1 つ取得されます。および「null または空ではない可能性があります」の 2 番目

メッセージを含めない場合 (たとえば@NotEmpty、それ自体)、「null または空ではない可能性があります」というメッセージ フィールドを持つ InvalidValue の 2 つのコピーを取得します。

Hibernate Validator がこれを行うのはなぜですか?? パラメーターを使用して上書きする値、または既定のメッセージのいずれかのメッセージを取得する必要がありますが、両方を取得する必要はありませんか??


より多くのコンテキストについて:

私はClassValidator<T>独自のClassValidator<MyClass>実装で拡張しています。アノテーションでは実行できないカスタム検証を追加するためにそうしています。検証を判断するために、クラスの複数のプロパティの実行時の値を確認する必要があります。

オーバーライドする myClassValidator.getInvalidValues() を呼び出すと、検証が行われます。の実装内でgetInvalidValues()呼び出しsuper.getInvalidValues()て初期エラー リストを作成し、カスタム エラーをそのリストに追加します。いずれの場合でも、 への呼び出しにsuper.getInvalidValues()は重複メッセージが含まれます。1 つはアノテーションに渡されたメッセージ プロパティに一致し、もう 1 つはアノテーション メッセージのストック値に一致します。


4

1 に答える 1

1

ジャスティン、

私はここ数ヶ月、HibernateValidatorを使用しています。あなたが説明したのと同じ問題に遭遇したことはありませんが、私も拡張していませんClassValidator。カスタム検証の場合、Hibernateリファレンスガイドには、カスタム制約を作成する方法が示されています。

組み込みの制約を現在のプロジェクトでほぼ独占的に使用することができました。あるケースでは、整数フィールドで非常に特殊な計算を行う必要がある場合、リファレンスガイドで説明されているようにカスタム制約を作成しました。そよ風でした。

あなたの特定の問題について言えば、私は自分の側で一種の健全性チェックとして簡単なテストアプリを作成しました。

import org.hibernate.validator.*;

public class HibernateValidatorTest {
    @NotEmpty
    @NotNull
    private String validateMe;

    public static void main ( String[] args ) {
        ClassValidator<HibernateValidatorTest> validator = 
            new ClassValidator<HibernateValidatorTest>( HibernateValidatorTest.class ); 

        InvalidValue[] inVals = 
            validator.getInvalidValues( new HibernateValidatorTest() );

        for ( InvalidValue inVal : inVals ) {
            System.out.println( inVal.getMessage() );
        }
    }
}

フィールドに両方のHibernate制約があるvalidateMe場合、コンソール出力は次のようになります。

may not be null or empty
may not be null

どちらか一方を削除すると、コンソールに1つのメッセージのみを出力するという期待される効果があります。

これがお役に立てば幸いです。

ブライアンT.グラント

于 2009-06-30T15:02:39.863 に答える