JSR303参数校验

Spring ValidatorHibernate 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

image-20210309170306862

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

image-20210309170812181

自定义校验类:

用于检测手机号

参考NotNull或Length的源码

image-20210309190620872

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

image-20210309190707603

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);
}
}
}
}

使用

image-20210309190526973


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!