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