1.简介
JSR是Java Specification Requests的缩写,意思是Java 规范提案
JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation
即,JSR 303,Bean Validation规范 ,为Bean验证定义了元数据模型和API.。默认的元数据模型是通过Annotations来描述的,但是也可以使用XML来重载或者扩展。
2.常用校验注解
分类:Bean Validation 中内置的 constraint
Constraint | 详细信息 |
---|---|
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Futuret | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
分类:Hibernate Validator 附加的 constraint
Constraint | 详细信息 |
---|---|
被注释的元素必须是电子邮箱地址 | |
@Length | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串的必须非空 |
@Range | 被注释的元素必须在合适的范围内 |
3. 使用步骤
3.1 pom坐标
注意:上面的坐标是规则,下面的坐标是实现,如果只有规则没有实现,则校验规则不会生效
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.0.Final</version>
</dependency>
3.2 在需要校验的实体类上加上 @Valid 注解
3.3 按照需求进行自定义校验规则
public class User {
private long id;
@NotNull//非空
@Email(message = "必须是邮箱地址类型")//必须是邮箱地址类型
private String name;
@Pattern(regexp = "^[A-Z]$/",message = "首字母必须是A-Z")//使用正则表达式自定义校验规则,首字母必须是A-Z
private String city;
@NotEmpty
private String sex;
}
3.4 测试
3.5 获取错误提示信息
在方法中加上BindingResult类型参数,改参数自行封装了错误信息
4. 分组校验
相同的字段属性在不同的情况下,校验的规则有所区别。
例如,一个实体类的的 id 在新增的情况下,需要校验是否为空,而在修改的情况下则不需要。同理,实体类的其他属性字段在新增和修改的情况下也有所差异
分组校验步骤:
① :新增校验的分组接口(空接口,不需要实现)
② :在实体类的属性字段上新增分组属性
③:在Controller 层的方法上新增 @Validated({xxx.class}) 分组属性
测试
新增方法:
5. 自定义校验注解
① :新增自定义校验注解
②:对自定义的注解进行配置
package com.example.valid;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented
@Constraint(validatedBy = { CustomConstraintValidator.class })//自定义的校验器类
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface CustomGroup {
//错误提示消息的配置文件的读取路径
String message() default "{com.example.valid.CustomGroup.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
//校验的字段的数据类型:字符串类型的数组
int[] vals() default { };
}
配置文件:ValidationMessages.properties
配置的是默认的错误提示信息,如果是中文,可能会有乱码的问题
③ :编写自定义的校验器类。配置该注解的校验规则
package com.example.valid;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
/**
* 描述:
* 自定义校验器
* 校验规则:如果传过来的参数不在设置的范围内,则抛异常
* @author XueGuCheng
* @create 2020-12-20 17:46
*/
public class CustomConstraintValidator implements ConstraintValidator<CustomGroup,Integer> {
private Set<Integer> set = new HashSet<>();
//初始化方法
@Override
public void initialize(CustomGroup constraintAnnotation) {
//获取到校验的字段范围
int[] vals = constraintAnnotation.vals();
for (int val : vals) {
set.add(val);
}
}
/**
* 判断是否校验成功
* @param value 需要校验的值
* @param context
* @return
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
//判断传过来的参数是否在规定的范围内
return set.contains(value);
}
}
④ :对需要的属性字段进行配置
校验规则:当是新增方法时,num 的值如果不在范围(1和3)内,则新增失败。否之成功。
Controller层新增方法的配置: