【问题标题】:Add Custom Validation Annotation for a Parameter in Controller - JSR-303为控制器中的参数添加自定义验证注释 - JSR-303
【发布时间】:2020-02-27 11:59:31
【问题描述】:

我不知道如何在 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 ..
}

在,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;
}

注意:zipCodeService.isValidZipCode() 是一个简单的boolean 方法。

问题是当我调用端点时,它永远不会访问@ValidZipCode 注释。是否需要设置任何 bean 配置以使其正常工作?

感谢您的帮助;)

更新

感谢@cassiomolin 的回答。确实,当我用 @Validated 注释控制器类时,它可以工作:D

我希望这篇文章能帮助其他开发者;)

【问题讨论】:

  • 感谢您的出色解释。还有一件事:需要在 pom.xml 中添加 spring-boot-starter-validation 依赖项。如果您不这样做,Spring 不会抱怨,但自定义验证类将被忽略。我花了一些时间才弄明白。

标签: spring-boot bean-validation


【解决方案1】:

确保您的控制器类使用@Validated 进行注释。

请参阅documentation 中的以下引用:

要符合 Spring 驱动的方法验证条件,所有目标类都需要使用 Spring 的 @Validated 注释 [...] 进行注释 [...]

【讨论】:

  • 正是我需要的!它现在完美运行! :D
猜你喜欢
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多