下面就为大家详细讲解“SpringBoot参数校验之@Validated的使用详解”。
什么是@Validated
在Spring框架中,我们经常需要对方法入参的校验,以保证参数的正确性。 SpringBoot基于Hibernate Validator,为开发者提供了方便简洁的实现方式:@Validated。
@Validated 用于校验方法入参,可以将该注解放置在类或方法上。放在类上,将对该类所有方法生效。
@Validated 支持的校验注解
@Validated 除了支持 Hibernate Validator 中的约束注解外,还支持 Spring 自己定义的注解,其中包括:
- @NotBlank, @NotNull, @NotEmpty
- @Email, @Range, @Length
- 自定义注解(通过 @ConstraintValidator 实现自定义注解)
@Validated 的使用
使用 @Validated 需要先引入 Hibernate Validator 的依赖:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
具体使用示例如下。
方法参数校验
在 Controller 中需要校验的方法入参前加上 @Validated 注解即可。
@RestController
@Validated
public class UserController {
@PostMapping("/user")
public String addUser(@RequestBody @Validated User user) {
userService.addUser(user);
return "添加用户成功";
}
}
自定义校验注解
自定义注解需要实现一个 ConstraintValidator 接口,并在使用时通过该注解指定校验器。
下面给出一个自定义的注解 @Phone:
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {
String message() default "电话号码格式不正确";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
PhoneValidator 的实现:
public class PhoneValidator implements ConstraintValidator<Phone, String> {
private static final String PHONE_REGEX = "^1([38]\\d|5[0-35-9]|7[3678])\\d{8}$";
private boolean required;
@Override
public void initialize(Phone constraintAnnotation) {
required = constraintAnnotation.required();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (required && StringUtils.isBlank(value)) {
return false;
} else {
return Pattern.matches(PHONE_REGEX, value);
}
}
}
在需要校验的属性上加上 @Phone 注解即可:
public class User {
@Phone
private String phone;
// setter and getter
}
示例
下面提供两个示例,以便更好地理解 @Validated 校验方法参数的过程。
示例一
有一个简单的用户注册接口需要对请求参数进行校验,要求 username 不为空且长度要在 5-20 之间,而 password 必须更长一些,至少 8 个字符。
@RestController
@Validated
public class UserController {
@PostMapping("/register")
public String register(@RequestParam @NotBlank @Length(min = 5, max = 20) String username,
@RequestParam @NotBlank @Length(min = 8) String password) {
return "用户名:" + username + ",密码:" + password;
}
}
其中带有 @NotBlank 和 @Length 注解的参数均需要通过校验,否则将会返回错误信息。
示例二
通过自定义注解 @Phone 实现对手机号参数进行校验。
@RestController
@Validated
public class UserController {
@PostMapping("/user")
public String addUser(@RequestBody @Validated User user) {
userService.addUser(user);
return "添加用户成功";
}
}
public class User {
private String username;
@Phone
private String phone;
// setter and getter
}
在 User 对象中的属性 phone 上使用了 @Phone 自定义注解,用于校验手机号格式。如果格式不正确,将会抛出错误信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot参数校验之@Validated的使用详解 - Python技术站