自定义验证注解,参数通过成员变量传递,会不会有问题

sprouting 发布于 04/13 14:22
阅读 398
收藏 1

代码如下:

@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;
    }
}

上面的代码没写完,但大概思路就是这样了,在初始化的时候将注解中的参数放到了成员变量中,今天忽然想到这个会不会在多线程下有问题,但我在下面的验证中确实无法获得注解信息,一般是这样传递数据吗,网上看的都是这样写的,实际使用暂时没发现问题,但不确定是否没问题

加载中
0
sprouting
sprouting

自己找到答案了,差不多确定了,初始化的代码只执行一次,赋值到成员变量中是没问题的,但需要注意的是,不要去手动修改成员变量的数据,否则会影响到下一次验证,比如上面假设有一个message,我第一次往里面插入数据1,再次使用的时候发现里面多了个1,在插入一次,就2个11了,所以这些成员变量不要去动

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部