您的位置:首页 > 编程语言 > Java开发

SpringMvc (六) 自定义验证

2016-01-20 19:10 656 查看

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<MyValidate,String> {
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<User> 集合
Set<ConstraintViolation<User>> cvs = validator.validate(user);
//获取 迭代器
Iterator<ConstraintViolation<User>> ite = cvs.iterator();

while(ite.hasNext()){

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

}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: