基于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包了!

各种输入框动态校验框架 各种输入框动态校验框架,输入内容自动提示,提示框在输入框后提示 立即下载

相关推荐

opencv+nvcodec实现视频硬解码

最近遇到一个新项目,AI推理在上,为了方便和节省成本的考虑决定研究下模块。根据官网的说法显卡具有独立的和模块,所以理论上和是独立互不干涉的。以前的项目都只是把显卡当成推理工具,没有将它的功能利用起来,本身也是一种浪费。事实真的有这么丝滑吗?看到这里,如果你真的觉得是白叫的那就真的是了,事实究竟如何,请听我娓娓道来。NVCODEC全称是 NVIDIA VIDEO CODEC,是NVIDIA为绝大多数显卡配置的硬件编解码单元。不一定是所有显卡都有,一般来讲越新的显卡硬件编解码就越强,支持的格式也就越新。

jiexijihe945的博客 1万+

java校验组(Validation)

java校验组导包hibernatespringframework创建异常类校验器的工具类例子常用校验注解 导包 hibernate <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>版本自行查找</version> </dependency&gt

圣贤参上 1万+

Ubuntu22.04系统安装及配置

下载Ubuntu22.04系统镜像(下载地址:链接:https://caiyun.139.com/m/i?提取码:fLRJ),结合rufus和系统镜像制作USB启动盘,在物理机服务器上通过USB启动盘进行安装;或通过Esxi虚拟化平台创建虚拟机,然后在虚拟机中使用系统镜像进行安装。

cheagoun的博客 8万+

Java校验validate

validation 技术在Java中运用最早在2009 年,Java 官方提出了 Bean Validation 规范,而后经历了JSR303、JSR349、JSR380 三次标准的更迭,发展到了 2.0。Bean Validation 和 我们以前学习过的 JPA 一样,只提供规范,不提供具体的实现。因此实际使用过程,常用的是 hibernate 的校验组件:org.hibernate.hibernate-validator。

皮球 3634

基于SECS协议开发的简明教程(1)

SEMI SECS MES E4 E5 E30 E37 HSMS SDK

L251210269的专栏 7631

STM32+A4988控制步进电机

基于A4988芯片驱动42步进电机,在STM32F1上进行测试,最高可以实现16细分。

个人博客 4万+

java validator ip_【java】【校验】使用java自带的Validator完成字段校验,完成请求入参属性校验...

packagecom.sxd.swapping.validation;importorg.apache.commons.collections4.CollectionUtils;importorg.apache.commons.lang3.StringUtils;importjavax.validation.ConstraintViolation;importjavax.validation.Va...

weixin_34723479的博客 275

UI-TARS本地部署

UI-TARS是一个用于本地部署的交互控制模型,支持桌面应用的自动化操作。部署步骤包括:首先,从官方GitHub仓库下载项目源码和模型checkpoint;其次,使用vLLM框架进行本地模型部署,启动API服务;最后,通过客户端调用API实现功能。部署过程中可能遇到pynvml模块或模型配置问题,提供了相应的解决方案。此外,还支持通过UI-TARS-Desktop客户端进行本地桌面应用的交互控制。整体流程旨在帮助用户快速实现UI-TARS的本地部署与应用。

DYF的博客 2531

Java类属性字段校验(validation的使用)

Java类属性字段校验(validation的使用)1、需求来源:日常校验需求2、validation介绍2-1、常见的注解2-2、快速入门1、简单校验2、自定义校验注解3、通用的Validtor校验工具类 1、需求来源:日常校验需求 日常开发中,我们时常需要提供可靠的 API 接口,此时对于请求的入参就需要校验,以保证最终数据入库的正确性,这就成了必不可少的活。例如说,用户注册时,会校验手机格式的正确性、邮箱格式的正确性、密码非弱密码等。 但是如果使用 if-else 这种代码去校验, 那么需要校验的地方

rao991207823的博客 2万+

华硕电脑Win10改Win7系统:BIOS设置详解

通过上述步骤,华硕电脑用户可以将系统从Windows 10更改为Windows 7。虽然这个过程可能涉及一些技术细节和潜在的风险(如数据丢失和驱动不兼容),但只要按照指南仔细操作并做好准备工作,大多数用户应该能够成功完成系统回滚。请记住,在进行任何系统更改之前都要备份重要数据,并确保已了解所有潜在的风险和限制。希望本文能够帮助到需要回滚到Windows 7的华硕电脑用户!

nntxthml的博客 2262

华为od面试手撕真题【分解质因数】

华为od面试手撕真题【分解质因数】

MISAYAONE的博客 1136

springboot 使用校验框架validation校验

基本校验方式 基本校验方式二 基本校验方式三 @Validated和@Valid区别 分组校验 分组校验二 分组校验 分组 1 自动校验 @SysLog("修改sysBusiness") @ApiOperation("修改") @PutMapping("{id}") @RequiresPermissions("sys:business:update") public...

shawnyang2019的博客 3776

C# 上位机内存泄漏排查指南:3 个工具 + 4 个技巧,从 GC 频繁到稳定运行 720 小时

C# 上位机内存泄漏排查的核心是「先定位泄漏存在,再追溯引用根源,最后修复验证通过「Visual Studio 诊断工具(快速定位)+ dotMemory(深度分析)+ PerfView(生产监控)」三个工具的配合,结合「复现场景、排查静态成员+事件、检查非托管资源、GC 日志验证」四个技巧,可高效解决绝大多数泄漏问题。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 739

java 反射类 spring_基于java反射的验证框架

本文转自:http://blog.youkuaiyun.com/firejuly/article/details/8190229 看过之后感觉很好,转载到博客里方便随时查看 第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分。 Mybatis 是另外一种写在前面相信很多经历了项目的人,会发现几乎...

weixin_34588509的博客 142

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java注解验证实体_Java通过注解和反射 实现模拟 Hibernate Validator验证框架对实体对象的字段验证功能...

需求:1实现对字段的非空校验2实现对邮箱的正则验证3实现对年龄字段的未成年判断输出:若字段为空则打印注解传递的message若邮箱格式正则验证不通过则输出邮箱格式错误若年龄小于18则打印注解传递的message1 创建一个实体类(getter&&setter略)【下面的所有文件都在同一个包中】public class User {@NotNull()String userid;@N...

weixin_39639919的博客 171

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java 通过注解和反射 实现模拟 Hibernate Validator验证框架对实体对象的字段验证功能

需求: 1实现对字段的非空校验 2实现对邮箱的正则验证 3实现对年龄字段的未成年判断 输出: 若字段为空则打印注解传递的message 若邮箱格式正则验证不通过则输出邮箱格式错误 若年龄小于18则打印注解传递的message 1 创建一个实体类(getter&&setter略)【下面的所有文件都在同一个包中】 public class User { @NotNull() String userid; ...

c_o_d_e_的博客 488

java手写aop_用spring Aop 和反射,手写牛p的验证框架

目前spring常用的验证框架有 JSR - 303 、Bean验证框架等等。但是这些验证框架都有一个毛病,就是使用困难,内聚性差,并且代码可控性低。比如JSR - 303框架注解,@Null、@NotNull 等等,太过于繁琐,并且一个实体类中每个字段都要注解验证。但是我们常用的验证可能只有空值检查,或者适合我们项目的常用验证。并且自定义验证太过于麻烦,并且报错信息控制繁琐到让人难以忍受。所以本...

weixin_33060757的博客 262

Java 反射机制的安全隐患与防范措施:在框架开发与代码审计中的应用

随着网络安全形势日益严峻,曾经我们自诩为不可能有漏洞的Java语言也逐渐因为反射漏洞、远程任意执行命令漏洞和反序列化漏洞让我们不得不重视起安全。本文从不同角度出发探究反射机制究竟是如何造成安全隐患并如何防范

杨若瑜的技术博客 1219

反射API安全编程:从源头阻断代码注入的威胁

在Java等支持反射(Reflection)的编程语言中,代码注入是一种常见的安全威胁,它允许攻击者动态地修改或执行原本不被允许的代码。为了从源头上阻断这种威胁,我们需要采取一系列的安全编程措施,包括但不限于限制反射的使用、验证输入、使用安全的API和框架等。下面,我将通过一些示例代码和策略来展示如何在Java中增强反射使用的安全性,从而阻断代码注入的威胁。

sa10027的博客 452

java_进阶:类的加载和反射

1、 类加载 当某一个程序在运行时,需要使用某一个类,如果该类还未被加载到内存中,则系统会通过类的加载,类的链接,类的初始化三个步骤来完成对类的初始化。 类的加载: ​ 就是指将class文件读入内存,并位置创建一个java.lang.Class对象。 ​ 任何类被使用时,系统都会为之建立一个java.lang.Class对象。 类的链接: ​ 验证阶段:用户检验被加载的类是否有完整的结构,并和其他的类协调一致。 ​ 准备阶段: 负责为类的变量分配内存,并设置默认初始值 ​ 解析阶段: 将类的二

wbgd_19751979的博客 285

守护应用边界:通过反射API实现安全的输入输出过滤

首先,你需要定义哪些类、方法或字段是安全的,可以通过反射访问。这可以通过白名单机制来实现,即只有在白名单中的类或方法才允许被访问。java复制代码static {> clazz) {AP调用I测试地址通过使用白名单和输入验证,你可以在Java中使用反射API时提高应用的安全性。然而,过度依赖反射可能会降低代码的可读性和性能,因此请慎重考虑是否需要在你的应用中使用反射。

shuju_Lucks的博客 261

使用java自定义注解完成ORM框架映射

使用自定义注解完成ORM框架映射。 思路:使用java反射机制获取每个属性上的注解value值,再拼接成数据库sql语句。

m0_70985211的博客 261

Java高级之反射学习

反射 Java反射机制概述 静态 VS 动态语言 动态语言 是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进, 已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时 代码可以根据某些条件改变自身结构 主要动态语言:Object-C、C#、JavaScript、PHP、Python等 静态语言 与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++ Java不是动态语言,但Java可以称之为“准动态语言”,即Java有一定的动态性, 我

工一木子 640

Java反射详解

反射:框架设计的灵魂 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。 反射:将类的各个组成部分封装为其他对象,这就是反射机制。 好处: 可以在程序运行过程中,操作这些对象。 可以解耦,提高程序的可扩展性。 反射机制有什么用? 通过java语言中的反射机制可以操作字节码文件(class文件)。 运行时分析类的能力。 在运行时检查对象,例如,编写一个适用于所有类的 toString 方法。 实现泛型数组操作代码。 利用 Method 对象,这个对象很像C++中的函数指针。 反射机制的相

flow 323

Java反射

Java反射

qq_45847507的博客 2720
上一篇: 基于xmlrpc的远程控制管理
下一篇: 基于JQuery的一个图片预览功能
hellohank
博客等级 码龄19年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值