6

Bean Validation(JSR-303)を明示的に呼び出すコードを次のように記述しています。

public class Example {

    @DecimalMin(value = "0")
    private static final String ANNOTATED = "";

    public void isPossitiveNumber(String str){

        ValidatorFactory factory =
             Validation.buildDefaultValidatorFactory();

        ConstraintValidator<DecimalMin, String>
             validator = 
                  factory.getConstraintValidatorFactory().getInstance(
                          DecimalMinValidatorForString.class);


        validator.initialize(
                  ReflectionUtils.findField(getClass(), "ANNOTATED")
                         .getAnnotation(
                          DecimalMin.class));

        boolean isValid = validator.isValid(str, null);

        return isValid;


    }


}

booleanisValid= validator.isValid(str、null);に注意してください。それを入手/構築する方法が見つからなかったので、私は に転送nullします。ConstraintValidatorContextこの特定のケースでは、ConstraintValidatorContext内部的に使用されていないため、これは問題ありませんが、ハックであることは明らかです。どうすればいいConstraintValidatorContextですか?

追加した

ユースケースを提供するように依頼されました。したがって、たとえば、カスタムバリデーターを作成していて、既存の検証を再利用したいとします。または、上記のようにプレーンJavaコードを記述していて、既存の検証を再利用したいと考えています。

4

3 に答える 3

2

簡単な答えは、できないということです。ConstraintValidatorContextはインターフェースであり、このようなインスタンスを取得するための Bean Validation API はありません。独自の実装を作成することもできますが、それを適切に実装するには、Bean Validation プロバイダーの多くの機能を再実装する必要があります。たとえば、Hibernate Validator 固有の実装 ( https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintValidatorContextImpl) を見てください。ジャワ

とはいえ、あなたの再利用の試みは間違っていると思います。これは Bean Validation のインデントではなく、移植性がなく保守が難しいコードになってしまいます。既存の制約を再利用したい場合は、@NotNull と @Size を再利用する @NotEmpty など、制約の構成を確認してください。

@Documented
@Constraint(validatedBy = { })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@ReportAsSingleViolation
@NotNull
@Size(min = 1)
public @interface NotEmpty {
    String message() default "{org.hibernate.validator.constraints.NotEmpty.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

    /**
     * Defines several {@code @NotEmpty} annotations on the same element.
     */
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    public @interface List {
        NotEmpty[] value();
    }
} 
于 2013-03-15T09:45:49.870 に答える
0

その場合、検証する制約のグループを宣言する必要があります。次に、そのグループの通常の検証を呼び出すことができます。グループ定義とそのセマンティクスについては、仕様のセクション 2.1.1.2 およびセクション 3.4 を参照してください。グループを検証するには、 を呼び出すだけですValidator.validate(T Object, Class<?>... groups)。この場合、 をいじる必要はありませんConstraintValidatorContext

于 2013-03-14T14:31:08.393 に答える