Spring Validator和Hibernate Validator是两套Validator,可以混着用,这里我们用Hibernate Validator。
Hibernate Validator
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#preface
Spring Validator
https://docs.spring.io/spring/docs/5.0.5.RELEASE/spring-framework-reference/core.html#validation
SpringBoot已经集成了参数校验,但是此次使用时有些用法用不上,比如length等,不知道是什么原因。官网对Validator的描述也只有几段。
尝试导入pom
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
|
idea一直导入失败
最后尝试
1 2 3 4 5
| <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>7.0.1.Final</version> </dependency>
|
成功
使用:
直接使用内置的注解:
1、在需要应用的实体类前@Valid

2、去实体类中在需要验证的参数加具体验证内容

自定义校验类:
用于检测手机号
参考NotNull或Length的源码

自己创建一个检测手机号码是否正确的接口和一个类

IsMobile.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| package com.mc.validator;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.CONSTRUCTOR; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target;
import javax.validation.Constraint; import javax.validation.Payload;
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Documented @Constraint(validatedBy = {IsMobileValidator.class }) public @interface IsMobile { boolean required() default true; String message() default "手机号码格式错误";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { }; }
|
IsMobileValidator.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| package com.mc.validator;
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext;
import com.mc.util.ValidatorUtil; import org.apache.commons.lang3.StringUtils; public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {
private boolean required = false;
@Override public void initialize(IsMobile constraintAnnotation) { required = constraintAnnotation.required(); }
@Override public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { if(required){ return ValidatorUtil.isMobile(s); }else{ if(StringUtils.isEmpty(s)){ return true; }else { return ValidatorUtil.isMobile(s); } } } }
|
使用
