自定义valida验证注解
2019-05-05 本文已影响0人
绵知了
1. 自定义valida验证注解
1.1 定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ ElementType.METHOD, ElementType.FIELD }) //注解作用域
@Retention(RetentionPolicy.RUNTIME) //注解作用时间
@Constraint(validatedBy = MyConstriantValidator.class) //执行校验逻辑的类
public @interface ConstraintDemo {
// 验证不通过的消息 default 为默认值
String message() default "valid fail message";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
1.2 定义校验类
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class ConstraintDemoValidator implements ConstraintValidator<ConstraintDemo, Object> {
/**
* 初始化
*
* @param constraintDemo
*/
@Override
public void initialize(ConstraintDemo constraintDemo) {
System.out.println("my validator init");
}
/**
* 真正的校验逻辑
*
* @param value 传入过来的值
*/
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
// 校验的逻辑
String validValue = String.valueOf(value);
if (null == validValue) {
return false;
}
return true;
}
}
1.3 扩展,可在校验类中可定义service类
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class ConstraintDemoValidator implements ConstraintValidator<ConstraintDemo, Object> {
@Autowired
private StudentService studentService;
/**
* 初始化
*
* @param constraintDemo
*/
@Override
public void initialize(ConstraintDemo constraintDemo) {
System.out.println("my validator init");
}
/**
* 真正的校验逻辑
*
* @param value 传入过来的值
*/
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
// 校验的逻辑,从service中调用方法,获得该stduent
String validValue = String.valueOf(value);
Student student = studentService.getStudent(validValue);
if(null == student) {
return false;
}
return true;
}
}
1.4 使用
public class Student {
@ConstraintDemo(message = "username不能为null")
protected String username;
@RequestMapping("/test")
@ResponseBody
public MyResult testAnnotain(@Valid @RequestBody Student student, BindingResult result) {
if (result.hasErrors()) {
return MyResultExt.error(result);
}
return MyResult.OK();
}
2. 简单介绍
@Retention :用来说明该注解类的生命周期。它有以下三个参数:
RetentionPolicy.SOURCE : 注解只保留在源文件中,被编译器丢弃
RetentionPolicy.CLASS : 注解保留在class文件中,在加载到JVM虚拟机时丢弃
RetentionPolicy.RUNTIME : 注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。
@Target : 用来说明该注解可以被声明在那些元素之前。
ElementType.TYPE:说明该注解只能被声明在一个类前。
ElementType.FIELD:说明该注解只能被声明在一个类的字段前。
ElementType.METHOD:说明该注解只能被声明在一个类的方法前。
ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。
ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。
ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。
ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。
ElementType.PACKAGE:说明该注解只能声明在一个包名前。
@Constraint来限定自定义注解的方法
这里写的类是下面自定义的类
3. 注解验证List集合类
3.1 定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ElementType.METHOD,ElementType.FIELD}) //注解作用域
@Retention(RetentionPolicy.RUNTIME) //注解作用时间
@Constraint(validatedBy = LengthForCollectionStringValidator.class) //执行校验逻辑的类
public @interface LengthForCollectionString {
// 验证不通过的消息 default 为默认值
String message() default "collection valid fail message";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
// 最小长度, 默认0
long minLength() default 0;
// 最大长度
long maxLength();
// 正则表达式, 默认空
String regexp() default "";
// 是否必填,默认false
boolean required() default false;
}
3.2 定义校验类
import java.util.List;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.apache.commons.lang.StringUtils;
import com.justsy.army.common.utils.CollectionUtils;
public class LengthForCollectionStringValidator implements ConstraintValidator<LengthForCollectionString, Object> { // 两个泛型分别为自定义注解和要校验的类型
private long minLength;
private long maxLength;
private String regexp;
private boolean required;
public long getMinLength() {
return minLength;
}
public void setMinLength(long minLength) {
this.minLength = minLength;
}
public long getMaxLength() {
return maxLength;
}
public void setMaxLength(long maxLength) {
this.maxLength = maxLength;
}
public String getRegexp() {
return regexp;
}
public void setRegexp(String regexp) {
this.regexp = regexp;
}
public boolean isRequired() {
return required;
}
public void setRequired(boolean required) {
this.required = required;
}
/**
* 初始化
*
* @param lengthForCollectionString
*/
@Override
public void initialize(LengthForCollectionString lengthForCollectionString) {
setMinLength(lengthForCollectionString.minLength());
setMaxLength(lengthForCollectionString.maxLength());
setRegexp(lengthForCollectionString.regexp());
setRequired(lengthForCollectionString.required());
System.out.println("LengthForCollectionString init");
}
/**
* 真正的校验逻辑
*
* @param value 传入过来的值
*/
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
@SuppressWarnings("unchecked")
List<String> valueList = (List<String>) value;
if (CollectionUtils.isEmpty(valueList)) {
return false;
}
for (String item : valueList) {
if (item.length() < minLength || item.length() > maxLength) {
return false;
}
if (StringUtils.isNotEmpty(regexp)) {
if (!item.matches(regexp)) {
return false;
}
}
if (required) {
if (StringUtils.isBlank(item)) {
return false;
}
}
}
return true;
}
}
3.3 使用
public class Student {
@LengthForCollectionString(message = "手机号码不能为空且长度不能大于20个字符", minLength = 1, maxLength = 20, regexp = "^\\d{11,13}$")
private List<String> phoneList;
@RequestMapping("/test")
@ResponseBody
public MyResult testAnnotain(@Valid @RequestBody Student student, BindingResult result) {
if (result.hasErrors()) {
return MyResultExt.error(result);
}
return MyResult.OK();
}
4. 常用@Valid注解
限制 | 说明 |
---|---|
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Future | 限制必须是一个将来的日期 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |
@Past | 验证注解的元素值(日期类型)比当前时间早 |
@NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |