前言:
今天学到这个,闲着也是闲着,就写一个记录一下,也算是总结
我们的步骤是这样的
1.自定义注解State 2.自定义校验数据的类StateValidation实现ConstrainValidator接口 3.在需要校验的地方使用自定义注解
这边以State为例,创建注解
参考@NotEmpty设计我们的注解
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package javax.validation.constraints;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Documented
@Constraint(
validatedBy = {}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(NotEmpty.List.class)
public @interface NotEmpty {
String message() default "{javax.validation.constraints.NotEmpty.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
NotEmpty[] value();
}
}
这边我把比较有用的博客给找出来,有空可以看看
java中@Repeatable的理解-CSDN博客@Repeatable-CSDN博客
使用中最为关键的
Spring注解之——@Constraint 自定义约束注解-CSDN博客
这边我们不使用@Repeatable与@Retention(使用默认的class作用范围)
package com.yjzx.anno;
import com.yjzx.validation.StateValidation;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.FIELD})//元注解
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
validatedBy = {StateValidation.class}//指定要识别的类
)
public @interface State {
//提供校验失败后的提示信息
String message() default "state参数的值只能是已发布或者草稿 ";
//指定分组
Class<?>[] groups() default {};
//负载,获取State注解附加信息
Class<? extends Payload>[] payload() default {};
}
这边使用StateValidation实现,并继承isValid方法
package com.yjzx.validation;
import com.yjzx.anno.State;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class StateValidation implements ConstraintValidator<State,String> {
/**
*
* @param s 将来要校验的数据
* @param constraintValidatorContext
* @return 若返回false则不通过,true校验通过
*/
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
//提供校验规则
if(s==null){
return false;
}
if(s.equals("已发布")||s.equals("草稿")){
return true;
}
return false;
}
}
像这样,因为我设置的@Target是字段、枚举的常量,可以这么使用,其他请去上面找一下
@Target({ElementType.FIELD})
@State
private String state;//发布状态 已发布|草稿
?结果的话,我这边插一个出错的截图吧
?就是这样,如果是对的就正常运行
结束。