前言:
validation主要功能是对用户输入的数据进行验证,确保数据的合法性和准确性。通过验证,可以防止用户输入错误或恶意输入,提高数据的质量和安全性。常见的验证功能包括:
- 必填字段验证:确保用户必须填写某些字段,防止漏填关键信息。
- 数据格式验证:验证用户输入的数据是否符合指定的格式要求,例如邮箱格式、手机号码格式等。
- 数值范围验证:验证数值型数据是否在指定的范围内,例如年龄必须在18岁以上。
- 唯一性验证:验证某个字段的值在数据库中是否唯一,例如用户名、邮箱等。
- 远程验证:通过发送请求到服务器端,验证用户输入的数据是否符合特定的条件,例如检查用户名是否已存在。
- 表单动态验证:实时验证用户输入的数据,例如实时检查密码强度、实时显示错误提示等。
通过使用验证功能,可以提高用户体验,减少错误数据的提交,保护系统的安全性和稳定性。
一、导入依赖
二、常用注解说明
1、@NotNull:用于验证对象是否为null。
不能为null没有size要求
2、@NotEmpty:用于验证字符串是否为空。
与@NotNull的区别,用此注解要求size>0
3、@Size:用于验证字符串、集合或数组的大小。
4、@Min和@Max:用于验证数字的最小值和最大值。
5、@Email:用于验证邮箱格式是否正确。
6、@Pattern:用于验证字符串是否匹配指定的正则表达式。
7、@AssertTrue和@AssertFalse:用于验证布尔值是否为true或false。
三、分组
加在实体类的属性中时,有的属性被标志为非空,但其他接口对此字段无要求,这样就产生了冲突,加入分组后则更清晰。
分组举例:
如下代码中有Add和Update两个分组,且都继承了Default,其中Default是默认分组,表示没有明确指定分组的属性,但这些属性是其他分组需要用的,所以继承Default可以继承该默认分组。
package com.moer.pojo;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.groups.Default;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
@NotNull(groups = Emp.Update.class)
private Integer id;
@NotEmpty
private String empName;
@NotEmpty
private String sex;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
//某个校验项没有指定分组,默认分组,分组可以继承
public interface Add extends Default {
}
public interface Update extends Default {
}
}
在controller中去使用分组,只需要指定分组所在位置即可,指定多个分组逗号隔开书写
四、自定义注解
新建包anno,新建注解State,并填入固定信息
其中@Constraint( validatedBy = {StateValidation.class} )该信息里的类为自己创建的,验证规则的类
package com.moer.anno;
import com.moer.validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented//元注解
@Target({ FIELD })//元注解 表示该注解用到的地方,这里表示在属性上
@Retention(RUNTIME)//元注解 表示注解保留到哪个阶段,这里是运行阶段
@Constraint(
validatedBy = {StateValidation.class}//指定提供校验规则的类
)
public @interface State {
//提供校验失败后的提示信息
String message() default "state参数的值只能是启用或者是禁用";
//指定分组
Class<?>[] groups() default {};
//负载 获取到state注解的附加信息(一般用不到)
Class<? extends Payload>[] payload() default {};
}
新建包,并添加验证规则的类
package com.moer.validation;
import com.moer.anno.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class StateValidation implements ConstraintValidator<State, String> {
/**
* 返回false校验不通过,返回true校验通过
* @param s 校验的数据
* @return 返回数据
*/
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
//提供校验规则
if (s == null) {
return false;
}
return s.equals("启用") || s.equals("禁用");
}
}
完成后将@State添加到指定的属性上,该属性就有了自定义的校验规则