校验初体验(Max)
JSR-303 Bean Validation
Hibernate-Validator
@Min @Max @Positive
//自定义校验
在构造器上面打上@Validated注解之后,在参数之前加上
@Max(value = 10,message = "自定义信息,不可以超过10")
@Min // 用法同上
@Range(min = 1 , max = 10 , message = "message内容")
可以做字符串长度的最大效验
这个是简单效验,我们如果对一个自己的DTO对象进行验证呢?
DTO对象的简单效验
在控制器中参数之前加入@Validated 就可以做到参数检查了
对象级联效验
在需要验证的字段上面加上验证注解
外层级联上面添加@Valid 就可以做到对象级联的简单效验了
Valid和Validated
他们都可以开启校验,Valid 其实是一种认证标准,validated是一种扩展
那什么时候用Valid的,什么时候用Validated呢?
就按照上面用!开启验证Validated,使用级联的时候用Valid
自定义校验注解
关于自定义注解,我们新建一个对应功能的效验注解,每一个效验注解是要追随一个类的
注解代码
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented //注解的注释加入到文档中
@Retention(RetentionPolicy.RUNTIME) // 注解保留在运行的阶段
@Target({ElementType.TYPE,ElementType.FIELD}) // 注解目标对象是对象和方法
@Constraint(validatedBy = PasswordValidator.class)
public @interface PasswordEqual {
int min() default 6;
int max() default 16;
String message() default "passwords are not equal";
Class<?>[] groups() default {}; // 规范代码,必须写
Class<? extends Payload>[] payload() default {}; // 规范代码,必须写
// 关联类
}
其中,min,max,message方法是对应注解中的参数
注解中的变量类型都是基本变量类型,不要使用牛皮的类型,好吗,宝贝
对应类的代码
package com.zking.zsjking.validators;
import com.zking.zsjking.dto.PersonDTO;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
// 第一个是注解的类型
//第二个参数是自定义注解修饰的目标类型(你这个注解打到哪里,就写什么类型,打到类上面就是类的类型,打到字段上面就是对应字段的类型)
public class PasswordValidator implements ConstraintValidator<PasswordEqual, PersonDTO> {
private int min;
private int max;
@Override
public void initialize(PasswordEqual constraintAnnotation) {
//获取到校验注解的参数
this.min = constraintAnnotation.max();
this.max = constraintAnnotation.min();
}
@Override
public boolean isValid(PersonDTO personDTO, ConstraintValidatorContext constraintValidatorContext) {
// todo 具体的字段校验
// ******************
//获取类的成员变量
String password1 = personDTO.getPassword1();
String password2 = personDTO.getPassword2();
return password1.equals(password2);
}
}
- 对应注解类是需要完成ConstraintValidator接口,起码重写isValid方法,在isValid方法中返回验证的结果
- initiallize 中的参数可以获取使用注解的信息
- isValid可以获取使用上面类的参数
使用
@PasswordEqual
public class Person {
private String password1;
private String password2;
}
根据上面的例子,就可以做到参数效验了