代码如下:
@Retention(RUNTIME)
@Documented
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Constraint(validatedBy = CheckLengthValidator.class)
public @interface CheckLength {
/**
* 校验错误时候的提示信息
* @return
*/
String message() default "参数长度长度超过限定范围";
/**
* 分组,有时候只想让该注解在请求或修改的时候触发成功
* 对应 AddGroup 和 UpdGroup 接口
* @return
*/
Class<?>[] groups() default {
};
Class<? extends Payload>[] payload() default { };
/**
* 字段的默认最小值
* @return
*/
int min() default 0;
/**
* 字段的默认最大值
* @return
*/
int max() default Integer.MAX_VALUE;
String computeMode() default "string";
boolean joinMsg() default true;
String joinPramType() default "string";
}
上面定义了很多自定义的属性,在使用的时候会用到
public class CheckLengthValidator implements ConstraintValidator<CheckLength, String> {
/**
* 默认的字段长度
*/
private int min = 0;
private int max = Integer.MAX_VALUE;
private String computeMode = "byte";
private String joinPramType = "byte";
private boolean joinMsg = true;
/**
* 初始化方法
* @param constraintAnnotation 注解
*/
@Override
public void initialize(CheckLength constraintAnnotation) {
this.min = constraintAnnotation.min();
this.max = constraintAnnotation.max();
this.computeMode = constraintAnnotation.computeMode();
this.joinPramType = constraintAnnotation.joinPramType();
this.joinMsg = constraintAnnotation.joinMsg();
}
/**
* 校验方法
* @param value 需要验证的值
* @param context 校验的上下文
* @return true 校验成功, false 不合法
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null || "".equals(value)){
return true;
}
if (min < 0) {
min = 0;
}
int vl;
switch (computeMode){
case "string":
// 按照字符计算
vl = value.length();
break;
default:
// 默认按照字节计算
try {
//转换为数据库的长度
vl = value.getBytes(ConstantBase.Encoded.UTF).length;
} catch (UnsupportedEncodingException e) {
log.error("校验数据长度发生异常", e);
return false;
}
break;
}
if (min <= vl && vl <= max){
return true;
}
return false;
}
}
上面的代码没写完,但大概思路就是这样了,在初始化的时候将注解中的参数放到了成员变量中,今天忽然想到这个会不会在多线程下有问题,但我在下面的验证中确实无法获得注解信息,一般是这样传递数据吗,网上看的都是这样写的,实际使用暂时没发现问题,但不确定是否没问题
自己找到答案了,差不多确定了,初始化的代码只执行一次,赋值到成员变量中是没问题的,但需要注意的是,不要去手动修改成员变量的数据,否则会影响到下一次验证,比如上面假设有一个message,我第一次往里面插入数据1,再次使用的时候发现里面多了个1,在插入一次,就2个11了,所以这些成员变量不要去动