Компонент проверки пользовательских ограничений Spring Boot - PullRequest
0 голосов
/ 13 декабря 2018

класс конфигурации

@ComponentScan(basePackages = {"validator"})
class AppConfiguration { ... }

класс аннотаций

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UniqueLoginValidator.class)
public @interface UniqueLogin {
    String message() default "{com.dolszewski.blog.UniqueLogin.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

класс валидатора

@Component
class UniqueLoginValidator implements ConstraintValidator<UniqueLogin, String> {

    private UserRepository userRepository;

    public UniqueLoginValidator(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void initialize(UniqueLogin constraint) {
    }

    public boolean isValid(String login, ConstraintValidatorContext context) {
        return login != null && !userRepository.findByLogin(login).isPresent();
    }

}

У меня есть класс со свойством @UniqueLogin String login, я также использую другиеаннотации типа @Size и @Max, последние 2 работают, но моя пользовательская аннотация не работает.

Не могли бы вы помочь понять, почему Spring не вызывает пользовательский валидатор?

1 Ответ

0 голосов
/ 13 декабря 2018

Мне удалось создать внутри src/main/resources/META-INF/services файл с именем javax.validation.ConstraintValidator с новой строкой списка, отделенной от всех квалифицированных имен созданных вами пользовательских валидаторов ограничений.

Таким образом, Spring автоматически зарегистрируетПользовательский валидатор.

Этот файл будет автоматически проверен из Spring и включен в встроенный артефакт.

Будьте внимательны при настройке аннотаций после применения этого решения.Вы должны аннотировать @Constraint(validatedBy = { }) для предотвращения двойной инициализации валидатора.

...