SpringMvc (六) 自定义验证

1.创建 MyValidate 注解类

package com.springmvc.myAnnotation;

import javax.validation.ConstraintValidator;
    //注解能放 在字段上
    @java.lang.annotation.Target(
        value={
            java.lang.annotation.ElementType.FIELD,
        }
    )
    //注解 的保留策略
    @java.lang.annotation.Retention(value=java.lang.annotation.RetentionPolicy.RUNTIME)
    @java.lang.annotation.Documented
    /* 验证注解通过 自定义验证类 实行验证 在这个类必须实现 ConstraintValidator接口
     * 第一个泛型 是本注解的名称
     * 第二个泛型 是验证的对象类型
     * 
     */

    @javax.validation.Constraint(validatedBy={ValidateHandler.class})
public @interface MyValidate {
    //正则通配符
    public abstract java.lang.String regex();
    //验证信息
    public abstract java.lang.String message() default "{javax.validation.constraints.Pattern.message}";
    public abstract java.lang.Class[] groups() default {};
    public abstract java.lang.Class[] payload() default {};

}

2.创建注解处理类 ValidateHandler

package com.springmvc.myAnnotation;

import java.lang.annotation.Annotation;
import java.util.regex.Pattern;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.apache.log4j.Logger;
import org.hibernate.validator.ap.checks.ConstraintValidatorCheck;

import com.sun.org.apache.xerces.internal.impl.validation.ValidationState;
import com.sun.org.apache.xerces.internal.impl.xpath.regex.Match;
/*自定义验证实现 ConstraintValidator
 * 重写 initialize 和 isValid
 * 
 * initialize 是初始化方法 可以做查询数据库等操作
 * 
 * isValid 是验证处理方法,return true 表示验证通过
 * 
 */

public class ValidateHandler implements ConstraintValidator {
    private Logger rootLogger = Logger.getLogger(ValidateHandler.class);

    private String regex;
    public void initialize(MyValidate info) {
        // TODO Auto-generated method stub
        //验证失败信息
        rootLogger.debug(info.message());
        this.regex = info.regex();
    }
    public boolean isValid(String filedValue, ConstraintValidatorContext cvc) {
        //验证字段的值
        rootLogger.debug(filedValue);
        rootLogger.debug(cvc);
        //如果匹配上注解上的通配符 验证通过
        return Pattern.matches(regex, filedValue);
    }



}

3.创建待验证对象 User

加入自定义注解验证

package com.springmvc.myAnnotation;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;

public class User {

    @MyValidate(regex="^[a-zA-Z]+$.+",message="名字必须是字母开头")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

4.测试自定义验证

package com.springmvc.myAnnotation;
import java.util.Iterator;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

import org.apache.log4j.Logger;
import org.junit.Test;
public class TestMyValidator {
    private Logger rootLogger = Logger.getLogger(TestMyValidator.class);

    @Test
    public void TestValidate() {
        //通过 Validation 构造 DefaultValidatorFactory 工厂
        ValidatorFactory hvf = Validation.buildDefaultValidatorFactory();
        //通过 ValidatorFactory 获取 validate
        Validator validator= hvf.getValidator();

        //创建一个待验证 user 实例 为其赋值
        User user = new User();

        user.setName("11");

        //通过 Validator 验证 user 实例  返回 ConstraintViolation 集合
        Set> cvs = validator.validate(user);
        //获取 迭代器
        Iterator> ite = cvs.iterator();

        while(ite.hasNext()){

            ConstraintViolation cv = ite.next();
            //获取 验证错误 信息 message
            rootLogger.debug(cv.getMessage());
            //获取错误的字段名称
            rootLogger.debug(cv.getPropertyPath());

        }

    }
}

你可能感兴趣的:(SpringMvc)