5

If have a Java class with some fields I want to validate using Hibernate Validator. Now I want my users to be able to configure at runtime which validations take place.

For example:

public class MyPojo {
    ...

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

    ...
}

Let's say I want to remove the NotEmpty check or replace it with Email or CreditCardNumber, how can I do it? Is it even possible? I guess it comes down to changing annotations at runtime...

4

3 に答える 3

4

普通じゃできないでしょ。

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

  1. クラスを拡張しClassValidatorます。
  2. メソッドをオーバーライドしgetInvalidVaues(Object myObj)ます。まず、 を呼び出しsuper.getInvalidValues(myObj)てから、カスタマイズした検証にフックを追加します。
  3. カスタム バリデータをインスタンス化getInvalidValuesし、validate を呼び出します。この時点で、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 ...
    }

}

そのため、カスタム検証コードには、「ユーザーが構成した場合はこの検証を行い、それ以外の場合はその検証を行う」などのロジックを含めることができます。休止状態の検証を強化する同じコードを活用できる場合とできない場合がありますが、どちらの方法でも、あなたがしていることは、休止状態バリデーターの「通常の」使用例よりも複雑です。

于 2009-04-23T12:26:00.867 に答える
2

実際には、休止状態のバリデーター4.1で可能です。プログラムによる制約の作成に関するドキュメントを読んでください。

于 2010-11-15T16:40:47.793 に答える