为控制器中的参数添加自定义验证注释 - JSR-303
Add Custom Validation Annotation for a Parameter in Controller - JSR-303
我不知道如何解决 Spring Boot.xml 中的以下用例。实际上,我有一个 Spring Boot Rest Api(例如:user-api
),其中包含以下控制器方法和参数的自定义验证器:
@PostMapping
public User createUser(@ValidZipCode @RequestBody @Valid User user){
return userService.saveUser(user);
}
User
Class 定义在外部依赖中(例如: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
注释控制器 class 时,它起作用了:D
我希望这 post 会对其他开发者有所帮助 ;)
确保您的控制器 class 带有 @Validated
注释。
请参阅 documentation 中的以下引用:
To be eligible for Spring-driven method validation, all target classes need to be annotated with Spring’s @Validated
annotation [...]
我不知道如何解决 Spring Boot.xml 中的以下用例。实际上,我有一个 Spring Boot Rest Api(例如:user-api
),其中包含以下控制器方法和参数的自定义验证器:
@PostMapping
public User createUser(@ValidZipCode @RequestBody @Valid User user){
return userService.saveUser(user);
}
User
Class 定义在外部依赖中(例如: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
注释控制器 class 时,它起作用了:D
我希望这 post 会对其他开发者有所帮助 ;)
确保您的控制器 class 带有 @Validated
注释。
请参阅 documentation 中的以下引用:
To be eligible for Spring-driven method validation, all target classes need to be annotated with Spring’s
@Validated
annotation [...]