参数校验注解
首先从网上找的常用参数注解
@NotNull 任何类型 属性不能为null
@NotEmpty 集合 集合不能为null,且size大于0
@NotBlanck 字符串、字符 字符类不能为null,且去掉空格之后长度大于0
@AssertTrue Boolean、boolean 布尔属性必须是true
@Min 数字类型(原子和包装) 限定数字的最小值(整型)
@Max 同@Min 限定数字的最大值(整型)
@DecimalMin 同@Min 限定数字的最小值(字符串,可以是小数)
@DecimalMax 同@Min 限定数字的最大值(字符串,可以是小数)
@Range 数字类型(原子和包装) 限定数字范围(长整型)
@Length 字符串 限定字符串长度
@Size 集合 限定集合大小
@Past 时间、日期 必须是一个过去的时间或日期
@Future 时期、时间 必须是一个未来的时间或日期
@Email 字符串 必须是一个邮箱格式
@Pattern 字符串、字符 正则匹配字符串
自定义注解
依赖
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
用法
参数校验注解的启用,共有两种启用注解,添加之后参数校验注解才会生效
- @Validated
@PostMapping("/")
public Object test(@Validated @RequestBody TestModel testModel) {
return testModel;
}
- @Valid
@Data
public class TestModel {
@NameValidatorAnnotation
private String name;
@Valid
private PassWord password;
public static class PassWord{
@NotNull
private String password;
}
}
自定义参数校验注解
注解
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE,
ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {NameValidator.class}) // 指定此注解的实现,即:验证器
public @interface NameValidatorAnnotation {
boolean required() default true;
String message() default "请输入正确的姓名格式";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
- 其中message,groups和payload都是必须要添加的
- 当验证不通过会返回message的内容
- @Target用于描述该注解的作用域
CONSTRUCTOR:用于描述构造器
FIELD:用于描述域
LOCAL_VARIABLE:用于描述局部变量
METHOD:用于描述方法
PACKAGE:用于描述包
PARAMETER:用于描述参数
TYPE:用于描述类、接口(包括注解类型) 或enum声明
- @Retention用于描述生命周期
SOURCE:在源文件中有效(源文件保留)
CLASS:在class文件中有效(class保留)
RUNTIME:在运行时有效(运行时保留)
- @Documented 使得该注解 javadoc工具记录
- @Constraint 指定实现类
实现类
@Slf4j
public class NameValidator implements ConstraintValidator<NameValidatorAnnotation, String> {
private boolean isRequired = false;
/**
* 获取注解属性的值
*
* @param constraintAnnotation
*/
@Override
public void initialize(NameValidatorAnnotation constraintAnnotation) {
isRequired = constraintAnnotation.required();
}
/**
* @param value
* @param context
* @return 是否通过验证
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value.equals("name")) {
return true;
} else return false;
}
}
- 实现ConstraintValidator接口,填入注解和对应被注解变量的类型
- initialize方法会传入注解实例,这里可以获取其他自定义属性的值
- isValid方法就是校验的方法,value是被注解的变量的值,返回true是通过校验,返回false就是不通过校验







网友评论