`
hellohank
  • 浏览: 146352 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

基于java反射的验证框架

阅读更多

写在前面

相信很多经历了项目的人,会发现几乎没有哪个项目不需要验证的。在经历过多个项目之后,有感于项目中使用最多的验证方式,这里写了一个基于java反射机制的验证框架。该框架适用于对javaBean中的属性通过java反射机制获取对应的值和用户直接传入的值来进行各种规则的验证。由于其几乎不依赖任何第三方jar包,因此可以适用所有java项目中。

开始使用


1、由于这些代码是在JDK1.5环境下编写的,用到了JDK1.5中的一些高级特性(如泛型等),因此使用该框架的项目最好是基于JDK1.5及以上版本的。
2、使用方式。
在这个框架中,整个使用的入口就是一个工具类:com.cloudframework.validation.ValidatorUtils。具体使用示例如下(示例代码在com.cloudframework.validation.sample.Demo):

DemoEntity de = new DemoEntity();//DemoEntity是一个javaBean。
  // 普通使用
  CloudBindingResult result = ValidatorUtils.validateEntity(de, "str", NotEmptyRule.class);
  System.out.println(result.getFieldErrorMessage("str"));
  // 自定义验证信息
  result = ValidatorUtils.validateEntity(de, "str", new NotEmptyRule("这里是指定验证信息示范!"));
  System.out.println(result.getFieldErrorMessage("str"));
  // 同时验证两个属性
  result = ValidatorUtils.validateEntity(de, "num,date", NotNullRule.class);
  System.out.println(result.getFieldErrorMessage("num") + " || " + result.getFieldErrorMessage("date"));
  // 使用多个验证规则
  result = ValidatorUtils.validateEntity(de, "str", NotEmptyRule.class, SingleEmailRule.class);
  System.out.println(result.getFieldErrorMessage("str"));// 这里注意其打印出来的验证信息!
  // 多个属性同时使用多个规则
  result = ValidatorUtils.validateEntity(de, "str,col", NotEmptyRule.class, SingleEmailRule.class);
  System.out.println(result.getFieldErrorMessage("str") + " || " + result.getFieldErrorMessage("col"));

 
其运行结果为:

不能为空!
这里是指定验证信息示范!
不能为空! || 不能为空!
不能为空!;邮箱格式不正确!
不能为空!;邮箱格式不正确! || 不能为空!;邮箱格式不正确!

 
3、 需要注意的是,有时候,我们需要验证一个单独的字符串或数字是否符合某个规则,这时候,这样的值并不是javaBean中的值,在这样的情况下,ValidatorUtils中的validateValue方法正是解决这样的单独验证的,它是可以直接验证给定的内容的。示例如下:

// 注意下面方法的返回值,是String类型。
System.out.println(ValidatorUtils.validateValue("hello",NotEmptyRule.class,SingleEmail.class)); 
System.out.println(ValidatorUtils.validateValue("",NotEmptyRule.class,SingleEmail.class)); 
System.out.println(ValidatorUtils.validateValue(null,NotEmptyRule.class,SingleEmail.class)); 
System.out.println(ValidatorUtils.validateValue("hello",NotEmptyRule.class));

 
其运行结果如下:

邮箱格式不正确!
不能为空!;邮箱格式不正确!
不能为空!;邮箱格式不正确!

 

自定义规则


在上面的使用中,我们用到了这些规则:NotEmptyRule、NotNullRule、SingleEmailRule。这些规则是我已经在框架中提供的仅有的三种规则!对于业务复杂、规则众多的情况下,用户可以自己扩展这些规则。扩展的方式为:新建一个类,并实现自com.cloudframework.validation.rules.ValidateRule接口。该接口代码如下:

package com.cloudframework.validation.rules;

/**
 * 验证规则的接口。所有的具体验证规则都实现自这个接口。
 * 
 * @author taofucheng
 * 
 */
public interface ValidateRule {
 /**
  * 进行具体规则的验证逻辑。
  * 
  * @param value
  *            具体的验证内容。
  * @return true:验证通过;false:验证不通过
  */
 public boolean validate(Object value);

 /**
  * 获取验证不通过时的报错信息。如果用户指定的验证信息为空,则返回默认的报错信息。
  * 
  * @return 返回验证的报错信息
  */
 public String getValidateInfo();
}

 
具体实现和规则的使用的示例可以参考现有的这三个规则类(NotEmptyRule、NotNullRule、SingleEmailRule)。

设计


在整个框架的设计中,其设计思路很简单:调用入口到反射取值,调用规则验证。其UML图可示例如下(使用StarUML作图):
UML图

设计思想与各关系上图中已经详细表明了,这里就不赘述了。

后记


现有的不足


字段名称不宜控制。现在的使用方式为:ValidatorUtils.validateEntity(entity, "field1", NotEmptyRule.class),其中字段名称是用户传入的字符串,如果该实体中的字符串名称发生改变,则这里是无法知晓的!也就是说,这里会因为实体中的字段名称变化而形成一个极隐蔽的隐患!


可扩展为注解

在现在这个年头,注解(annotation)似乎已经很被大众接受,同时也流行开了,从Spring到Hibernate,再到Struts……
在注解风靡的现在,如果这个验证框架没有注解使用方式估计会少了一席战场吧。由于本人急于使用,再加上最近也一直很忙,静不下心来完善,所以上面提到的注解功能就一直没写。其实,注解的实现很简单,建议大家可以参考一下Hibernate validator框架,我觉得这个验证框架很不错,它是完全基于注解的。我也会在后面的某一天将注解的内容补充完整。

补充


1、 对于验证中的字段名称随实体改变而不会留下隐患,我一直找不到一个好的办法解决。想想除了用注解的方式,还真没找到一个合适的方式。
2、 对于注解的使用,我个人认为对于代码的侵入性比较强。我想这也许就是为什么很多人对注解有一定的抵触情绪吧。
3、 这个验证框架,只是依赖于commons-lang.jar包,但只用到了其中的StringUtils类,如果将该类中用到的功能自己实现的话,可以不依赖于任何jar包了!

  • 大小: 85.8 KB
2
1
分享到:
评论
4 楼 zhoupan301415 2017-09-04  
写的非常不错,虽然代码量,但是考虑的还是很周全的,灵活性,扩展性,对于设计模式和反射的理解都很到位,10年能有这般水平,发展到现在,应该也是很厉害的人物了吧,加油!!!
3 楼 hellohank 2010-11-22  
cd_huangbo 写道
可以再结合权限来实现吗?

我觉得,证是对数据规则的验证,而权限是对请求/操作的验证。这是两种不同的验证,不需要结合吧,一旦结合会失去它们的灵活性,呵呵。
2 楼 cd_huangbo 2010-11-19  
可以再结合权限来实现吗?
1 楼 hellohank 2010-11-19  
不管是好是坏,大家给点意见啊~~

相关推荐

    一个既简单的校验框架

    本篇将深入探讨一个基于Java的简单校验框架的实现,该框架充分利用了注解和反射技术,旨在提供一种优雅且可扩展的解决方案。 首先,我们来理解注解(Annotation)在Java中的作用。注解是一种元数据,它提供了在源...

    Java后台验证框架

    本文将详细介绍一种基于Java的后台验证框架设计思路及其应用场景,旨在为开发者提供一种高效、可扩展且易于使用的验证方案。 #### 二、应用场景 在实际开发过程中,特别是在action或facade层,我们需要实现统一的...

    基于Java反射的APP自动化混合测试框架的研究与实现.zip

    本文将深入探讨一个基于Java反射技术构建的APP自动化混合测试框架的研究与实现。Java反射机制是Java语言的一个强大特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能够动态调用方法和改变对象状态。在...

    Java对象验证框架 OVal

    Java对象验证框架OVal是一个强大的工具,用于在Java应用程序中执行数据验证。它提供了一种声明式的验证方式,使得开发者可以方便地定义和实施对象级别的验证规则,而无需编写大量的自定义验证代码。OVal的核心功能是...

    基于java反射机制的山寨版WEB2

    在"基于Java反射机制的山寨版WEB2"项目中,开发者利用这一特性创建了一个简易的Web应用程序,实现了文件上传下载、处理中文乱码、NEW和SPRING模式的支持以及JSON数据交互等功能。 1. **文件上传下载与中文乱码处理*...

    Java 反射-动态代理

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行上发挥着关键作用。本文将深入探讨这两个概念,以及如何在实际开发中利用它们。 首先,我们来理解Java反射(Reflection)。Java反射...

    JAVA反射详细讲解

    Java反射详解 在Java编程语言中,反射是一个强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,甚至能够在运行时创建和访问这些对象。这种能力使得Java成为一种动态语言,增强了代码的灵活性和可扩展...

    java 反射 报错 no such method exception

    ### Java反射机制与NoSuchMethodException详解 在Java编程中,反射是一种强大的机制,允许程序在运行时检查和修改自身结构和行为。然而,当开发者尝试使用反射调用一个不存在的方法时,便会遇到`java.lang....

    android 反射注解框架

    总的来说,"android 反射注解框架"利用注解和反射的特性,为Android开发提供了一种简洁、高效的组件初始化方式,减少了重复代码,提升了开发体验。同时,这样的设计也具有较好的灵活性,可以随着项目需求的变化进行...

    Java反射相当的文档及示例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得动态性、灵活性和元编程成为可能,从而极大地扩展了Java开发者的工具箱。在Java中,...

    java反射给指定字段赋值

    ### Java反射机制详解:给指定字段赋值 在Java编程语言中,反射是一个非常强大的功能,它允许程序在运行时检查或“反映”自身,并直接操作内部属性(如类、方法和字段)。本文将深入探讨如何利用Java反射来访问并...

    Java反射机制

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、对象等的内部信息。这一机制的核心在于Java.lang.reflect包,它提供了Class、Constructor、Method和Field等类,使得我们可以...

    java反射与动态代理笔记

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将深入探讨这两个概念及其在实际开发中的应用。 **Java反射** Java反射API允许程序在运行时检查类、接口...

    利用java反射校验struts中的form(含正则表达式)

    在struts框架中,如果每次都去校验form中的每个字段,显然费时费力,本例通过java反射得到form中的字段和值,并较验,用于在与数据库交互之前的校验,从而防止数据库恶意注入. 随包附带一个通用的易扩展的正则表达式校验类...

    java反射基本方法测试

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类、接口、字段和方法的信息,使得我们可以在不知道对象具体...

    java反射机制.pdf

    ### Java反射机制详解 #### 一、引言 Java反射机制是Java语言中一项重要的功能,使得Java在一定程度上具备了动态语言的特性。通过Java反射机制,可以在运行时获取类的信息并操作类的对象,这为Java应用开发带来了...

    利用java反射、注解及泛型模拟ORM实现

    这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...

    基于Java的持久层框架,零配置,零SQL操作持久层.zip

    本资料包"基于Java的持久层框架,零配置,零SQL操作持久层.zip"着重介绍了如何使用一种无需配置、简化SQL操作的持久层解决方案。 1. **Java持久层框架的重要性** - **提高开发效率**:通过封装数据库操作,开发者...

Global site tag (gtag.js) - Google Analytics