Я не могу понять, как решить следующий вариант использования в 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
Надеюсь, этот пост поможет другим разработчикам;)