`
xmong
  • 浏览: 264268 次
  • 性别: 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








分享到:
评论

相关推荐

    The Java XML Validation API

    Java XML Validation API是Java平台中用于验证XML文档的重要工具,它是Java API for XML Processing (JAXP)的一部分。XML(eXtensible Markup Language)是一种用于标记数据的标准格式,广泛应用于数据交换、配置...

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

    Bean Validation 是一个基于 Java 的参数验证框架,提供了多种注解来实现参数验证。Bean Validation 框架的使用非常简单,下面是一个简单的示例: 首先,需要在 Maven 项目中添加以下依赖项: ```xml &lt;groupId&gt;...

    Input_Validation.zip_it_java validation

    4. **自定义验证器**:当内置的验证规则不能满足需求时,可以通过实现`javax.validation.ConstraintValidator`接口来自定义验证器。这样可以创建自己的验证注解和对应的验证逻辑。 5. **Spring Framework中的验证**...

    Java Validation Api实现原理解析

    Java Validation API的核心概念包括验证注解、约束声明、验证器和验证上下文。 在Java应用中,Validation API的实现往往依赖于一个提供者,例如Hibernate Validator,这是一个流行的实现,它提供了对标准注解的扩展...

    Java验证框架Validation.F0 0.9.0

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

    validation后端验证所需要jar包

    `validation`通常指的是Hibernate Validation框架,这是一个符合JSR 303和JSR 349标准的Java Bean验证实现。它允许开发者定义一组约束规则,并在运行时自动检查这些规则,如果违反规则,就会抛出异常。这个框架不仅...

    Java Web Jquery表单验证

    Java Web Jquery表单验证 jQuery是一个流行的JavaScript库,可用于在网页上进行各种操作,包括表单验证。 1、将基于Jquery的表单验证的调查问卷分为四个部分:FrontPage.html、write.html、end.html、style.css。 1...

    validation-framework验证框架

    `validation-framework`可能支持多种编程语言,如Java的Hibernate Validator、JavaScript的Joi等,它们都有各自的API和用法,但基本原理相同,都是通过定义规则和使用验证器来完成数据验证。 ### 集成到项目中 在...

    Java Validation Api如何实现自定义注解

    Java Validation API 是一个用于验证对象模型的框架,它允许开发者定义数据校验规则,并在运行时检查这些规则是否被遵循。在标准的API中,已经提供了很多预定义的注解,如 `@NotNull`, `@Size`, `@Pattern` 等,用于...

    基于java反射的验证框架

    2. 创建验证器:每个验证注解对应一个验证器,实现验证逻辑。 3. 注解解析:使用反射遍历对象的字段,查找并解析注解。 4. 执行验证:调用对应的验证器进行验证,收集错误信息。 5. 错误处理:将验证结果以适当的...

    javax.validation-1.0.0.GA.jar

    它扩展了基本的约束验证功能,提供了丰富的验证注解和自定义验证器的机制。在描述中提到的"结合hibernate-validator对实体做约束验证配置",意味着我们可以利用Hibernate Validator在实体类上添加注解,如@NotNull、...

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

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

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

    JAVA中通过Hibernate-Validation进行参数验证 JAVA中通过Hibernate-Validation进行参数验证是JAVA服务器端代码开发中的一种常用技术。在开发JAVA服务器端代码时,我们会遇到对外部传来的参数合法性进行验证,而...

    Java Validation Framework-开源

    Java Validation Framework(JVF)是一个开源的解决方案,旨在帮助开发者在Java应用程序中高效地处理业务规则验证。在快速发展的IT环境中,业务需求的频繁变化给系统设计和开发带来了挑战。为了应对这些变化,JVF...

    Struts2中Validation数据验证框架教程

    Struts2是一个强大的Java EE应用程序开发框架,特别适用于构建MVC(模型-视图-控制器)架构的应用。在Struts2中,Validation框架是用于处理数据验证的重要组件,它允许开发者在用户输入提交到服务器之前或之后进行...

    JAVA文本框验证大全

    - `javax.swing.JComponent`类提供了`setInputVerifier`方法,可以设置输入验证器对象,如`InputVerifier`,实现基本的验证功能。 7. **Apache Commons BeanUtils**: - Apache Commons项目提供了一套BeanUtils...

    Java中对输入框的各种验证插件

    在Java后端,可以使用如Hibernate Validator或Bean Validation框架进行验证。 7. **错误处理**:当验证失败时,JSValidation通常会显示错误提示。开发者可以通过配置错误消息和错误显示位置来优化用户体验。 8. **...

    validation

    综上所述,这个压缩包提供了一套完整的验证解决方案,包括了实际的验证实现(Hibernate Validator)、日志记录工具(JBoss Logging)以及验证接口和规范(Bean Validation API)。这三者结合,可以方便地在Java项目...

    Java Validation Api使用方法实例解析

    Java Validation API,作为JSR 303标准的一部分,为JavaBean提供了一种优雅的方式来执行数据验证。这个API允许开发者通过注解来定义验证规则,从而简化了业务逻辑中的参数校验。下面我们将详细讨论其使用方法和常见...

    Validation Demo

    它允许开发者为每个输入字段指定一个或多个验证器,这些验证器会在用户输入时或在提交表单前进行检查。验证器可以检查数据的类型、格式、范围等,例如检查电子邮件地址的正确格式、数字是否在指定范围内,或者字符串...

Global site tag (gtag.js) - Google Analytics