Возможно ли позднее связать ConstraintValidator при использовании пользовательских аннотаций - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть пользовательская аннотация для подтверждения запроса от клиента к нашему приложению, разработанному на Dropwizard . Аннотация выглядит как -

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = FreshContentIdValidator.class)
public @interface FreshContentId {

    String message() default "interest id already taken";

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

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

и, поскольку мы можем на наш путь записи выдержать выполнение тяжелых операций , в пределах FreshContentIdValidator мы проверяем String contentId на наличие в база данных. Это, в свою очередь, использует некоторые службы и их реализации -

public class FreshContentIdValidator implements ConstraintValidator<FreshContentId, String> {

    private FreshContentId freshContentId;

    private ContentManagementService contentManagementService;

    @Override
    public void initialize(FreshContentId freshContentId) {
        this.freshContentId = freshContentId;
        contentManagementService = com.google.inject.Injector.getInstance(ContentManagementService.class);
    }

    @Override
    public boolean isValid(String contentId, ConstraintValidatorContext context) {
        context.disableDefaultConstraintViolation();
        // perform validations using contentManagementService
        context.buildConstraintViolationWithTemplate("").addConstraintViolation();
        return true/false;
    }
}

Сейчас я нахожусь в процессе извлечения моделей запрос-ответ, чтобы поделиться ими с клиентами, но у меня есть сомнения то есть, возможно ли разделить эту строку кода так, чтобы она связывала валидатор только на прикладном уровне?

@Constraint(validatedBy = FreshContentIdValidator.class)

Конечно, я ищу эту возможность, поскольку для этого потребуется минимальное количество изменений кода и боль миграции из унаследованного кода, поскольку можно наблюдать за его реализацией, описанной выше. (Другими словами, удаление этой строки из пользовательской аннотации проверки упрощает ее совместное использование клиентами, но фактически не позволяет проверить содержимое.)

...