Spring Boot - Bean Validation, аннотация ограничений с помощью дженериков - PullRequest
0 голосов
/ 13 июля 2020

Spring Boot 2.3.1, с OpenJDK 14

Аннотация ограничений:

@Documented
@Constraint(validatedBy = {MyConstraintAnnotationValidator.class})
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyConstraintAnnotation {
    String message() default "";
    Class[] groups() default {};
    Class[] payload() default {};

    Class clazz();
    // or, not sure: Class<?> clazz();
}

Валидатор аннотаций ограничений:

public class MyConstraintAnnotationValidator implements ConstraintValidator<MyConstraintAnnotation, String> {
    @Override
    public void initialize(MyConstraintAnnotation constraintAnnotation) {
    // cac is: configurableApplicationContext
    Object obj = cac.getBean(constraintAnnotation.clazz());

    // problem: obj doesn't provide the methods to access
    // on the left side of the variable shall be also the clazz type
    // which is passed to the constraint annotation
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        return true;
    }
}

Использование аннотаций ограничений:

public class MyPojo {
...

@MyConstraintAnnotation(clazz = MyProperties.class)
private String field1;
...

// Getter/ Setter
}

Класс свойств:

@Component
@PropertySource("classpath:myproperties.properties")
@ConfigurationProperties(prefix = "myprefix")
public class MyProperties {
// fields
// Getter / Setter
}

Через аннотацию ограничений я хочу указать свой класс свойств, который будет использоваться в процессе проверки в классе валидатора.

Но внутри метод initialize(..) Я не могу получить доступ к Getter / Setter из моего класса свойств (MyProperties.class), потому что configurableApplicationContext.getBean(...) возвращает Object, должен создать переменную и передать ее переданному классу (например, MyProperties.class).

Как создать переменную, которая имеет в левой части тот же тип, который передается в аннотацию ограничения?

...