Добавить пользовательскую аннотацию проверки для параметра в контроллере - JSR-303 - PullRequest
0 голосов
/ 27 февраля 2020

Я не могу понять, как решить следующий вариант использования в Spring Boot. Действительно, у меня есть Spring Boot Rest Api (например: user-api) со следующим методом контроллера с настраиваемым валидатором для параметра:

@PostMapping
   public User createUser(@ValidZipCode @RequestBody @Valid User user){
       return userService.saveUser(user);
   }

Класс User определен во внешней зависимости ( например: user-model). Он имеет следующие поля:

public class User {
   @NotNull
   private String firstName;
   @NotNull
   private String lastName;
   private String zipCode;
   // getters, setters ..
}

In, user-api Я создал следующую настраиваемую аннотацию:

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ZipCodeValidator.class)
public @interface ValidZipCode {

    String message() default "Must be a valid zipCode. Found: ${validatedValue}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

}

И поэтому реализация ZipCodeValidator:

public class ZipCodeValidator implements ConstraintValidator<ValidZipCode, User> {
private ZipCodeService zipCodeService;

@Override
public void initialize(ValidZipCode constraintAnnotation) { }

@Override
public boolean isValid(User user, ConstraintValidatorContext constraintValidatorContext) {
    return !Objects.isNull(user.getZipCode()) ?
            zipCodeService.isValidZipCode(user.getZipCode()) :
            false;
}

NB: zipCodeService.isValidZipCode() - это простой метод boolean.

Проблема в том, что когда я вызываю конечную точку, она никогда не обращается к аннотации @ValidZipCode. Есть ли какая-либо конфигурация bean для настройки, чтобы она работала?

Спасибо за вашу помощь;)

ОБНОВЛЕНИЕ

Благодаря @cassiomolin за его ответ. Действительно, когда я комментирую класс контроллера с помощью @Validated, он работает: D

Надеюсь, этот пост поможет другим разработчикам;)

1 Ответ

2 голосов
/ 27 февраля 2020

Убедитесь, что ваш класс контроллера помечен @Validated.

См. Следующую цитату из документации :

Чтобы иметь право на валидацию Spring-метода, все целевые классы должны быть аннотированы Spring 101 * * аннотация [...]

...