一、介绍和依赖
hibernate-validator
是 Java 中常用的后端校验框架- https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/【参考文档】
🌻 在 SpringBoot 项目中配置如下依赖:🌻
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
二、方法的 Model 参数校验
🌻 使用步骤
① 在 Model 的 get 方法或成员变量添加相关的校验注解
② 给方法的 Model 参数添加 @Valid
注解
🌻 若校验失败会抛异常
① org.springframework.validation.BindException
② 通过 BindException.getBindingResult().getAllErrors()
可拿到全部的错误信息
三、方法的非 Model 参数校验
🌻 使用步骤
① 给 Controller 添加 @Validated
注解
② 给非 Model 参数添加相关的校验注解
🌻 校验失败会抛异常
① javax.validation.ConstraintViolationException
② 通过 ConstraintViolationException.getConstraintViolations
可拿到全部的错误信息
四、常用注解
@NotNull
: 不能为 null,可以为空串
@NotEmpty
: 不能为 null,且长度必须大于 0
@NotBlank
: 只能作用在 String 上,不能为 null,且去除空格后长度必须大于 0
@AssertFalse
:必须为 false
@AssertTrue
:必须为 true
@Max、@DecimalMax
:必须为一个不大于指定值的数字
@Min、@DecimalMin
:必须为一个不小于指定值的数字
@Digits
: 必须为一个小数,且整数部分的位数不能超过 integer,小数部分的位数不能超过 fraction
@Email
:必须是 Email,也可以通过正则表达式和 flag 指定自定义的 Email 格式
@Future
:必须是一个将来的日期
@Past
:必须是一个过去的日期
@Range
:必须在指定的范围内
@Size、@Length
:长度必须在 min 到 max 之间
@Pattern
: 必须符合指定的正则表达式
五、快速失败
🌻 默认情况是检查完全部的错误后才统一抛异常
🌻 可以设置快速失败:只要检测到一个错误,就直接抛出异常,不再继续检测
@Configuration public class ValidatorConfig { @Bean public Validator validator() { return Validation.byProvider(HibernateValidator.class) .configure() .failFast(true) .buildValidatorFactory() .getValidator(); } }
六、自定义校验规则
/** * @author 庆医 * @describe 自定义【hibernate-validator】的校验注解 * 校验手机号码 */ @Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = IsRightPhone.isRightPhoneValidator.class) public @interface IsRightPhone { String message() default "手机号码格式错误"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; class isRightPhoneValidator implements ConstraintValidator<IsRightPhone, String> { @Override public boolean isValid(String val, ConstraintValidatorContext context) { if (null == val || val.length() != 11) return false; return val.matches("^((19[0-9])|(13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$"); } } }