質問

いくつかのフィールドを持つ Java クラスがある場合は、Hibernate Validator を使用して検証したいと思います。ここで、ユーザーが実行時にどの検証を行うかを設定できるようにしたいと考えています。

例えば:

public class MyPojo {
    ...

    @NotEmpty
    String void getMyField() {
        ... 
    }

    ...
}

を削除したいとしましょう NotEmpty チェックするか、次のように置き換えます Email または CreditCardNumber, 、どうすればいいでしょうか?それは可能ですか?実行時にアノテーションを変更することになると思います...

役に立ちましたか?

解決

普通はできませんよ。

Hibernate Validator を介してより動的な検証を機能させるために私が行ったことは次のとおりです。

  1. を延長します。 ClassValidator クラス。
  2. オーバーライド getInvalidVaues(Object myObj) 方法。まず、電話してください super.getInvalidValues(myObj), を選択し、カスタマイズした検証にフックを追加します。
  3. カスタムバリデーターをインスタンス化して呼び出します getInvalidValues 検証します。Hibernate の注釈付き検証はこの時点で開始され、カスタム動的検証 (注釈でサポートされていないもの) も同様に開始されます。

例:

public class MyObjectValidator extends ClassValidator<MyObject>
{
    public MyObjectValidator()
    {
         super(MyObject.class);
    }

    public InvalidValue[] getInvalidValues(MyObject myObj)
    {
        List<InvalidValue> invalids = new ArrayList<InvalidValue>();
        invalids.addAll(Arrays.asList(super.getInvalidValues(myObj)));

        // add custom validations here
        invalids.addAll(validateDynamicStuff(myObj));

        InvalidValue[] results = new InvalidValue[invalids.size()];
        return invalids.toArray(results);
    }

    private List<InvalidValue> validateDynamicStuff(MyObject myObj)
    {
        // ... whatever validations you want ...
    }

}

したがって、カスタム検証コードには、「ユーザーが設定した場合はこの検証を実行し、そうでない場合はその検証を実行する」などのロジックを含めることができます。Hibernate 検証を実行する同じコードを利用できる場合とできない場合がありますが、いずれにせよ、実行していることは Hibernate Validator の「通常の」使用例よりも複雑です。

scroll top