`
xmong
  • 浏览: 258678 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java validation(java验证器实现)

阅读更多
Java validation
1. java验证器
   在java开发中我们有很多场景都会对java的属性值进行验证,如web开发中表单提交数据后台数据处理中需要对传入的值进行验证,当然目前java有很多开源属性值验证框架,如hibernate validation,spring框架中也提供了相应注解验证spring validation,相比两款验证本人觉得hibernate的提供的正则数据验证比较好用,但是这些验证比较通用,很多时候也没办法完全支持我们一些特殊场景的使用,比如我想要验证某个属性的值是否存在于某个枚举类中,有些特殊值想要特殊验证处理等,基于这些场景自己不得不另起炉灶,实现一些简单的java注解验证功能。

2. java验证案例
    下面通过注解构建两种简单验证方式来完成自定义验证器的简单实现,如下面要实现该数据类TestObject的验证,通过自定义注解构建验证验证策略进行验证:

package com.annotation.validate;

/**
 * 注解验证对象
 * @author xmong
 */
public class TestObject {

    /**
     * 注解验证名字只能是字母下划线
     */
    @PatternType(pattern="^\\w*$")
    String name;
    
    /**
     * 注解验证性别值是否为性别枚举类型中的值
     */
    @EnumType(classType=Sex.class)
    String sex;

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}


自定义注解

package com.annotation.validate;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 正则类型的注解
 * @author xmong
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PatternType {

    /**
     * 注解正则
     * @return
     */
    public String pattern();
    
    /**
     * 注解提示信息
     * @return
     */
    public String info() default AnnotationConfig.DEFAULT_INFO;
    
}



package com.annotation.validate;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 枚举类型注解
 * @author xmong
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumType {

    /**
     * 注解class类型
     * @return
     */
    @SuppressWarnings("rawtypes")
    public Class classType();
    
    /**
     * 注解提示信息
     * @return
     */
    public String info() default AnnotationConfig.DEFAULT_INFO;
    
}



package com.annotation.validate;

/**
 * 枚举类
 * @author xmong
 */
public enum Sex {

    MAN,WOMEN
}



要实现对不同注解的验证采用策略模式来实现,不同的验证实现类不同。

package com.annotation.validate;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;


/**
 * 验证测类,不同的验证类型需要不同验证服务来完成
 * @author xmong
 */
public class AnnotationValidationStrategy {
    
    static Map<String, AnnotationValidationService> annotationValidationServiceMap;
    
    //静态资源初始化加载
    static{
        init();//初始化测类
    }
    
    public static void init(){
        /**
         * 构建验证测类服务Map,根据注解类型关联相应的验证服务
         */
        annotationValidationServiceMap = new HashMap<String, AnnotationValidationService>();
        annotationValidationServiceMap.put(EnumType.class.getSimpleName(), new AnnotationValidationEnum());
        annotationValidationServiceMap.put(PatternType.class.getSimpleName(), new AnnotationValidationPattern());
    }
    
    //默认验证方法
    public static boolean validateAnnotation(Object obj) throws ValidateException{
       return validateAnnotation(obj, false);
    }

    /**
     * 遍历对象属性,根据不同的注解类型调用对应的验证服务对属性值进行验证
     * @param obj 验证对象
     * @param flag 值为null时是否验证
     * @return 验证通过返回true,反之既然
     * @throws ValidateException
     */
    public static boolean validateAnnotation(Object obj, boolean flag) throws ValidateException{
        if(null == obj) return false;
        Field[] fields = obj.getClass().getDeclaredFields();
        //遍历对象属性
        for (Field field : fields) {
            /**
             * 遍历属性注解,根据注解类型名调用相应的验证服务验证该属性
             */
            Annotation[] annotations = field.getAnnotations();
            for (Annotation annotation : annotations) {
                String type = annotation.annotationType().getSimpleName();
                AnnotationValidationService annotationValidationService = annotationValidationServiceMap.get(type);
                //判断服务是否存在,不存在则抛出异常
                if(null == annotationValidationService){
                    String msg = String.format("AnnotationValidationService '%s' is null!", type);
                    throw new ValidateException(msg);
                }else if(!annotationValidationService.validate(field, obj, flag)){
                    return false;
                }
            }
        }
        return true;
    }

    
    public Map<String, AnnotationValidationService> getAnnotationValidationServiceMap() {
        return annotationValidationServiceMap;
    }

    
   
}


验证服务接口


package com.annotation.validate;

import java.lang.reflect.Field;


/**
 * 验证接口
 * @author xmong
 */
public interface AnnotationValidationService {
    
    /**
     * 验证接口方法
     * @param field 需要验证的域
     * @param obj 需要验证的
     * @param flag 是特殊值标识通过位
     * @return
     */
    public boolean validate(Field field, Object obj, boolean flag) throws ValidateException;

}



验证实现类

package com.annotation.validate;

import java.lang.reflect.Field;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * 正则验证
 * @author xmong
 */
public class AnnotationValidationPattern implements AnnotationValidationService{

    public boolean validate(Field field, Object obj, boolean flag)throws ValidateException {
        //判断该属性是否有改验证注解
        if(!field.isAnnotationPresent(PatternType.class)) return false;
        return validateValue(field.getAnnotation(PatternType.class), field, obj, flag);
    }
    
    public boolean validateValue(PatternType patternType, Field field, Object obj, boolean flag) throws ValidateException{
        try {
            //设置属性的读取值权限
            field.setAccessible(true);
            Object object = field.get(obj);
            //根据标识判断属性值是否为null
            if(object == null && flag) return flag;
            //正则表达式验证属性值
            Pattern pattern = Pattern.compile(patternType.pattern()); 
            Matcher matcher = pattern.matcher(object.toString()); 
            return matcher.matches();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            throw new ValidateException(e.getMessage());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            throw new ValidateException(e.getMessage());
        } catch(Exception e){
            e.printStackTrace();
            throw new ValidateException(e.getMessage());
        }
        
    }

}


package com.annotation.validate;

import java.lang.reflect.Field;


/**
 * 枚举类型验证
 * @author xmong
 */
public class AnnotationValidationEnum implements AnnotationValidationService{
    

    public boolean validate(Field field, Object obj, boolean flag) throws ValidateException {
        if(!field.isAnnotationPresent(EnumType.class)) return false;
        return validateEnum(field.getAnnotation(EnumType.class), field, obj, flag);
    }
    
    @SuppressWarnings("unchecked")
    public boolean validateEnum(EnumType enumType, Field field, Object obj, boolean flag) throws ValidateException{
        try {
            field.setAccessible(true);
            Object object = field.get(obj);
            if(object == null && flag) return flag;
            //验证值是否为该注解枚举类中的值
            if(null == Enum.valueOf(enumType.classType(), object.toString()))return false;
            return true;
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            throw new ValidateException(e.getMessage());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            throw new ValidateException(e.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            throw new ValidateException(e.getMessage());
        }
    }

}



package com.annotation.validate;

/**
 * @author xmong
 */
public class Test {

    public static void main(String[] args) {
        TestObject to = new TestObject();
        to.setName("xmong");
        to.setSex("MAN");
        
        try {
            boolean flag = AnnotationValidationStrategy.validateAnnotation(to);
            System.out.println(flag);
        } catch (ValidateException e) {
            e.printStackTrace();
        }
        
    }
}



运行结果为: true








分享到:
评论

相关推荐

    Java验证框架Validation.F0 0.9.0

    配置简单,可自由扩展验证器,实际只要实现IValidator接口,以及在rules.fo.xml中添加相关的配置即可; 支持Spring接口; 使用过程中,你会感觉好像只用了 IValidateService.validate() 一个方法,这会让人感觉良好...

    java validation 后台参数验证的使用详解

    本篇文章主要介绍了java validation 后台参数验证的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Validation:使用Java实现的灵活验证库。 包含Kotlin扩展

    使用Java实现的灵活验证库。 最新版本: 安装 Gradle是唯一受支持的构建配置。 步骤1.将JitPack存储库添加到构建文件中将其添加到存储库末尾的root build.gradle中: allprojects { repositories { maven { url...

    JAVA中通过Hibernate-Validation进行参数验证

    主要介绍了JAVA中通过Hibernate-Validation进行参数验证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Hibernate Bean Validation jar包

    Java Bean 的验证流程如下:在实际使用中调用 Validator.validate(JavaBeanInstance) 方法后,Bean Validation 会查找在 JavaBeanInstance上所有的约束声明,对每一个约束调用对应的约束验证器进行验证,最后的结果...

    graphql-java-extended-validation:graphql-java输入的验证库

    graphql-java的扩展验证 该库为提供了对字段和字段参数的扩展验证 使用 &lt; groupId&gt;com.graphql-java&lt;/ groupId&gt; &lt; artifactId&gt;graphql-java-extended-validation &lt; version&gt;16.0.0 &lt; type&gt;pom compile ' ...

    validation后端验证所需要jar包

    java入参验证,支持实体类中对象验证,list,map 。验证是否为空,是否空字符串等等......包含所需jar包

    validation-workshop:定义练习以使用 Java8 lambdas 实现验证的测试

    实现 Validation.java 的缺失部分以使测试通过。 最好按照测试在每个套件中出现的顺序进行处理,并按以下顺序进行测试: 基本验证测试验证转换测试高级验证测试请密切注意 api 类型签名和注释,尤其是当您不确定...

    JAVA_API1.6文档(中文)

    javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含核心 JAX-WS API。 javax.xml.ws.handler 该包定义用于消息处理程序的 API。 javax.xml.ws.handler.soap 该包定义用于 SOAP ...

    Cpf-Validator:CPF验证程序(CPF验证程序)-Java

    CPF验证器(CPF验证器) CPF是巴西国税局保留的记录,无论年龄或国籍,任何自然人只能使用一次。 每个条目由CPF为11个十进制数字的注册号唯一标识。 个人登记簿是巴西联邦税收局维护的登记簿,任何自然人,无论...

    Java Validation Framework:Java验证框架(不是JSR-303实现)。-开源

    该框架允许修改(校正)测试值。 支持验证本地化值; 允许在文本表示之间来回转换值;... 支持元数据,该元数据允许检查任何实体类型(不仅是Java Bean或POJO),还有更多。 此外,此框架还包含许多预定义的验证组件。

    Struts2验证框架的配置及validation.xml常用的验证规则

    Struts2验证框架的配置及validation.xml常用的验证规则

    config-validation-processor-java7-3.0.1.zip

    spring-configuration-validation-processor.zip,验证spring@configuration类的java 6注释处理器验证spring@configuration类的java6+注释处理器

    java实用组件集 源码 验证脚本组件

    《java实用组件集》 源码 验证脚本组件 针对sample.htm做以下说明: 1、在与间加入如下代码:&lt;script Language="JavaScript" src="ScriptLib/Validation.js"&gt; 2、在与间添加onclick函数如页面submitButton_onclick()...

    Validation-1.1PHP验证库.zip

    &lt;?... namespace Respect\Validation; use ReflectionClass; use Respect\Validation\Exceptions\ComponentException;...服务器端验证就是当表单提交后,在服务器端通过JAVA,等服务器端代码对客户输入进行验证。

    Java 1.6 API 中文 New

    javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含核心 JAX-WS API。 javax.xml.ws.handler 该包定义用于消息处理程序的 API。 javax.xml.ws.handler.soap 该包定义用于 SOAP 消息...

    Java轻量验证框架Fluent-validator.zip

    Fluent-validator 是一套 Java 的轻量验证框架,提供流式风格(Fluent Interface)的调用体验,类似 JDK8 stream式的 API,支持注解式验证器,支持 JSR303 -Bean Validation 标准最佳实现 Hibernate Validator 集成...

    validation-masterPHP数据验证库.zip

    &lt;?... /** ... ... * Licensed under The MIT License ...namespace Cake\Validation;... * Describes objects that can ...服务器端验证就是当表单提交后,在服务器端通过JAVA,等服务器端代码对客户输入进行验证。

    java验证器Validator包及依赖包,亲测可用

    java验证器Validator包及依赖包,亲测可用! hibernate-validator-5.1.3.Final.jar;classmate-0.8.0.jar;jboss-logging-3.2.0.Final.jar;validation-api-1.1.0.final.jar

    validation

    validation验证zip,喜欢的可以下载。

Global site tag (gtag.js) - Google Analytics