0

カスタム JSR 303 バリデーターを作成する場合、フィールド名の代わりにフィールドの値をバリデーターに渡す方法はありますか?

これが私がやっていることです..

このケースを検証するカスタム クラス レベルの検証を構築する必要があります。

A と B の 2 つのフィールドがあり、B は日付フィールドです。A の値が 1 の場合、B が null ではなく、その値が将来の日付であることを確認します。

この投稿に続いて、これらの要件で検証を構築することができました。FutureDateValidator の isValid() メソッドで、A の値が 1 かどうかを確認してから、日付の有効性を確認しました。

@CustomFutureDate(first = "dateOption", second = "date", message = "これは将来の日付でなければなりません。")

これで、フィールド C と D の新しいセットができました。ここで、D は再び日付フィールドです。今回は、C の値が 2 の場合、D が将来の日付であることを確認する必要があります。この場合、最初のフィールドの値がハードコーディングされているため、既に実装したバリデーターを使用できません。では、この問題を解決して、これら 2 つのケースで同じバリデーターを再利用するにはどうすればよいでしょうか。

4

1 に答える 1

0

値をハードコードしないようにするには、1/2 をカスタマイズ可能にしました。

@CustomFutureDate(first = "dateOption", firstValue = "1", second = "date", message = "This must be a future date.")

@CustomFutureDate機能させるには、注釈を変更する必要があります。

public @interface CustomFutureDate {
    String first();
    String firstValue();
    ...
}

と実装:

public class CustomFutureDateValidator implements ConstraintValidator<CustomFutureDate, Object> {
    private String firstFieldName;
    private String firstFieldValue;
    ...

    @Override
    public void initialize(final CustomFutureDate constraintAnnotation) {
        firstFieldName = constraintAnnotation.first();
        firstFieldValue = constraintAnnotation.firstValue();
        ...
    }

    @Override
    public boolean isValid(final Object value, final ConstraintValidatorContext context) {
        // use firstFieldValue member
        ...
    }
}
于 2012-07-29T07:44:34.797 に答える