原文链接:http://blog.csdn.net/a973893384/article/details/51517388

具体思路:

  我们使用自定义注解实现。然后需要解决的是两个问题:

    1是如何扫描自定义注解

    2是如何扫描到自定义注解做出对应的validate校验

  第一个问题的解决方案:

    自定义一个AnnotationHelper类,该类可配置自定义注解的源文件的package路径。 

  1. AnnotationHelper{
  2.   private static final String BASE_PAGE = "";
  3.   private Map<Annotation,Class<? extends Annotation>> ANNOTATION_CLASS_SET = new HashMap<Annotation,Class<? extends Annotation>>();
  4.  
  5.   static(){
  6. loadAnnotation(BASE_PAGE);
  7. }
  8.  
  9.    
  10. private void loadAnnotation(){
  11. /**
  12. *扫描指定包下的Class文件,将得到的Annotation以及对应的Class对象注入ANNOTATION_CLASS_sET
  13. */
  14. }
  15.  
  16.   private static Annotation choice(Field field){
        //根据传入的field对象得到该field对象上面的validate注解,可拓展为得到Annotation[]
      }
  17.  
  18.   private static Class<? etxends Annotation> choice(Annotation annotation){
        //..
      }
  19.  
  20.  }

前面发现,AnnotationHelper类在加载前就会自动扫描注解包,将注解对应信息放入它的map中去,然后调用choice方法可以得到校验注解的对象信息和Class信息。

  使用的不是框架自动扫描,而是手动调用Validate类的validate方法校验对象。

  1. public static void main( String[] args ) {
  2. User user = new User();
  3. Validator validator = Validator.newInstance(user);
  4. validator.validate();
  5. }

  Hibernate的validate框架使用的是@Validate注解实现,我们也可以这样拓展,然后就是配置一个监听或者说是扫描的问题

  Validate类包含一个校验方法validate,校验传入的object,出现问题抛出异常。

    

2、如何做出对应的validate校验?

  Annotation类至少包含几个字段,例如:

  1. @Target(ElementType.FIELD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface NotNull {
  4. Class<?> clazz() default NotNullValidate.class;
  5. String value() default Message.NOT_NULL;
  6. }

Validate类的规则,ValidateSuper接口:

  

  1. //一个抽象类,包含抽象方法validate、init,用于编写校验逻辑和初始化操作
    public abstract class AbstractValidate<T> {
    //...
  2. }

  

编写自己的validate校验框架原理(转)的更多相关文章

  1. JSR303完成validate校验并编写BeanValidator工具类

    一.引入pom依赖 <!-- validator --> <dependency> <groupId>javax.validation</groupId> ...

  2. struts_19_对Action中所有方法、某一个方法进行输入校验(手工编写代码实现输入校验)

    对所有方法进行校验1.通过手工编写代码的形式实现 需求:用户名:不能为空手机号:不能为空,并且要符合手机号的格式1,3/5/8,后面是9个数字 第01步:导包 第02步:配置web.xml <? ...

  3. Struts2 validate校验

    一般的,用户注册的时候,我们需要校验一些用户提交过来的参数. 一般有两道屏障,一是在前台页面上使用js进行验证,直接杜绝了不正常信息的提交.二是将提交过来的信息进行验证,不通过则返回注册页面并显示错误 ...

  4. Spring Boot 2.x 编写 RESTful API (二) 校验

    用Spring Boot编写RESTful API 学习笔记 约束规则对子类依旧有效 groups 参数 每个约束用注解都有一个 groups 参数 可接收多个 class 类型 (必须是接口) 不声 ...

  5. jquery.validate校验文件使用说明

    官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一导入js库<script src="../js/ ...

  6. jquery validate 校验使用总结

    一.jquery.validator表单验证id和name问题 因为后台是struts,表单提交,所有输入框的值保存在name=对象.名字中,而jquery.validator表单验证用的是name, ...

  7. jquery validate 校验时,如果有type=hiddien

    当校验时,不需要校验#warnId,否则会引起输入框#alarmtile里的样式混乱

  8. rails 国际化、validate校验、flash提示

      1.Rails的国际化 根据特定的locale信息,提取相应的内容 通过config/environment.rb,指定应用的转换文件 config.i18n.load_path +=Dir[Ra ...

  9. jquery.validate校验+jquery.form提交,配合使用

    原文链接:http://www.cnblogs.com/datoubaba/archive/2012/06/06/2538873.html 概述:本篇主要讨论jquery.validate结合jque ...

随机推荐

  1. 0501-Hystrix保护应用-超时机制、断路器模式简介

    一.概述 hystrix对应的中文名字是“豪猪”,豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与hystrix本身的功能不谋而合,因此Netflix团队将该框架命名为Hystri ...

  2. vue指令详解

    一.vue简绍 1. Vue.js是什么    Vue.js也称为Vue,读音/vju:/,类似view,错误读音v-u-e. 版本分为v1.0 和 v2.0 2.Vue.js的特点 1. 是一个构建 ...

  3. 剑指offer(第2版)刷题 Python版汇总

    剑指offer面试题内容 第2章 面试需要的基础知识 面试题1:赋值运算符函数 面试题2:实现Singleton模式  解答 面试题3:数组中重复的数字 解答 面试题4:二维数组中的查找 解答 面试题 ...

  4. Django CSRF cookie not set.错误

    post提交表单报错: Forbidden (403) CSRF verification failed. Request aborted. You are seeing this message b ...

  5. oracle procedure简单的将临时表的数据插入或更新到目标表

    CREATE OR REPLACE PROCEDURE DEAL_SYNC_SCH_CUSTPHONE_NEW AS CURSOR C_CURU IS SELECT * FROM CBS_COS.SC ...

  6. Python 一行代码实现并行

    需求 给定一个list   针对list 中每个元素执行一定的操作(这个操作很费时间,例如爬数据的时候调用某个网站的接口),返回操作后的list 例如 给定 1-10个数,在每个数字后面加个字母a 方 ...

  7. Android 6.0 Kotlin 蓝牙扫描

    package com.arci.myapplication import android.app.Activityimport android.os.Bundleimport android.sup ...

  8. java synchronized和(ReentrantLock)区别

    原文:http://blog.csdn.net/zheng548/article/details/54426947 区别一:API层面 syschronized使用 synchronized即可修饰方 ...

  9. websocket redis实现集群即时消息聊天

    websocket与redismq实现集群消息聊天 1.application.properties server.port=8081 #thymeleaf配置 #是否启用模板缓存. spring.t ...

  10. Linux系统启动管理 系统安全

    Linux GRUB加密方法 加密grub防止黑客通过单用户系统破解root密码 ,进入系统窃取数据.给grub加密,不让别人通过grub进入单用户.  生成密码 [root@localhost ~] ...