基于注解的方式校验其实很多,但是在复杂模型方式方面,貌似未查询到,所以自己写了一个,主要是复杂的json串,将其生成Object,然后对于Object校验...
注解申明不过于进行介绍,主要谈下配合反射进行递归校验过程,校验
这里以UrlParser校验,当然接口提供后可以有无数个比如money、date、身份证等,
注解类
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ValidationDriver { public ValidationType type(); }
/** * * @author Young * */ public enum ValidationType { // support multi type Length, Email, NotBlank, URL, Phone, Money, Date; }
核心的校验过程
public static ValidateMsg validate(Object field) throws Exception { ValidateMsg result = null; for (Field f : field.getClass().getDeclaredFields()) { if (f.isAnnotationPresent(ValidationDriver.class)) { ValidationDriver driver = f .getAnnotation(ValidationDriver.class); f.setAccessible(true); Object value = null; try { value = f.get(field); } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } IAnnotationParser parse = fetchValidateParser(driver); result = parse.validate(f, value); if (result != null && !result.isResult()) break; } else if (f.getType().getName().contains("hundsun")) { result = recursiveCheck(field, f); if (result != null && !result.isResult()) break; } else if (f.getType().getName().equals("java.util.List")) { // 获取泛型 Type fc = f.getGenericType(); f.setAccessible(true); if (fc == null) { continue; } Method m = (Method) field.getClass().getMethod( "get" + getMethodName(f.getName())); //当类型中是List,获取list的数据,再进行校验 List list = (List) m.invoke(field); if (list != null && list.size() > 0) { for (Object object : list) { result = validate(object); if (result != null && !result.isResult()) break; } } if (result != null && !result.isResult()) break; } } if (result == null) { result = new ValidateMsg(); result.setMessage("everything is ok"); } return result; } /** * 递归校验 * * @param field * @param f * @return * @throws IllegalAccessException * @throws InvocationTargetException * @throws InstantiationException * @throws IllegalArgumentException */ private static ValidateMsg recursiveCheck(Object field, Field f) throws Exception { ValidateMsg result = null; f.setAccessible(true); Field[] fields = f.getType().getDeclaredFields(); for (Field fieldSon : fields) { if (fieldSon.isAnnotationPresent(ValidationDriver.class)) { ValidationDriver driver = fieldSon .getAnnotation(ValidationDriver.class); fieldSon.setAccessible(true); Object valSon = fieldSon.get(f.get(field)); IAnnotationParser parse = fetchValidateParser(driver); result = parse.validate(fieldSon, valSon); if (result != null && !result.isResult()) break; } else if (fieldSon.getType().getName().equals("java.util.List")) { // 获取泛型 Type fc = fieldSon.getGenericType(); fieldSon.setAccessible(true); if (fc == null) { continue; } Method m = (Method) f.get(field).getClass() .getMethod("get" + getMethodName(fieldSon.getName())); List list = (List) m.invoke(f.get(field)); if (list != null && list.size() > 0) { for (Object object : list) { result = validate(object); if (result != null && !result.isResult()) break; } } } } return result; } private static String getMethodName(String fildeName) throws Exception { byte[] items = fildeName.getBytes(); items[0] = (byte) ((char) items[0] - 'a' + 'A'); return new String(items); }
上述方式支持
public class A{ @ValidationDriver(type = ValidationType.NotBlank) private int age; private List<B> list; get/set } public class B{ @ValidationDriver(type = ValidationType.NotBlank) private int id; private List<C> list get/set } public class C{ @ValidationDriver(type = ValidationType.NotBlank) private int id; @ValidationDriver(type = ValidationType.URL) private String name; }
最终URLparser校验
public class UrlParser implements IAnnotationParser { @Override public ValidateMsg validate(Field field, Object value) { ValidateMsg msg = null; if (value != null) { Pattern p = Pattern .compile( "^(http|www|ftp|)?(://)?(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*((:\\d+)?)(/(\\w+(-\\w+)*))*(\\.?(\\w)*)(\\?)?(((\\w*%)*(\\w*\\?)*(\\w*:)*(\\w*\\+)*(\\w*\\.)*(\\w*&)*(\\w*-)*(\\w*=)*(\\w*%)*(\\w*\\?)*(\\w*:)*(\\w*\\+)*(\\w*\\.)*(\\w*&)*(\\w*-)*(\\w*=)*)*(\\w*)*)$", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(value.toString()); if (!m.matches()) { msg = new ValidateMsg(); msg.setMessage(field.getName() + " url is invalid"); msg.setResult(false); } } return msg; } }
结论:
能够支持多种复杂类型,然后进行成员变量的校验,基本能够完成其校验工作。通过学习反射了解到很多知识点,弥补过多if else判断,当然这里其实校验过程也可以使用antlr方式进行表达式强校验,可以查阅我其它文章。
相关推荐
在工作中,我看到JavaEE6中提供了一个基于注解的Bean校验框架,另外Hibernate也提供了类似功能的基于java注解的校验,我们产品也需要这种功能,无奈用的是JavaEE5,因此我自己写了一个简单的基于注解的校验框架,...
SpringBoot+SpringSecurity+JWT+MybatisPlus实现基于注解的权限验证,可根据注解的格式不同,做到角色权限控制,角色加资源权限控制等,粒度比较细化。 @PreAuthorize("hasAnyRole('ADMIN','USER')"):具有admin或...
基于Spring boot + maven,以注解+AOP方式实现的java后端项目接口参数校验框架。迄今为止使用最简单、最容易理解的参数校验方案。博客地址:https://blog.csdn.net/weixin_42686388/article/details/104009771
Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件...
基于注解式的ssh2考试系统 分层清晰 前端校验完备 中文不会乱码 有数据库生成的sql语句和一些基础数据 还有什么不懂的可以加q:715279837
Bean Validation是Java定义的一套基于注解的数据校验规范。这里简单实现了Spring Boot 参数校验,包括自定义注解,分组校验,全局异常处理等
JavaFX表单验证(目前支持,TextField和ComboBox)
项目概述:本项目是一个基于SSM(Spring、SpringMVC、MyBatis)框架和Bootstrap的图书管理系统,实现了CRUD(创建、读取、更新、删除)功能,并提供数据校验机制及Ajax交互支持。主要开发语言为Java,辅以CSS和...
基于HAL库的单片机全双工设计,支持crc校验,支持输入数字改变电平,代码有注释。采用中断和查询的传输方式。适合新手学习借鉴。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
基于stm32单片机实现modbus-rtu 通讯规约源码-有注释 通讯数据的类型及格式: 信息传输为异步方式,并以字节为单位。每个字节由8位二进制数组成。主机和从机之间传递的通讯信息是10位的字格式: 字格式(串行数据) ...
基于QT Creator开发的兼容QT 5.6版本的(语言C++)串口调试助手源码,界面超级漂亮、功能齐全,接收区和来显示串口消息,在调试时,可指定串口、波特率、校验位、数据位、停止位,关闭串口和清空接收区、以十六进制...
基于Java8 + Spring Boot打造Http请求拦截验证框架 :face_savoring_food: 花10分钟学会它做点什么,它会帮你检查Http Request参数。 可以防御重放攻击,校验参数被修改(数字签名) ,校验请求超时 :paw_prints: | :...
通过拦截器实现了方法级粒度的鉴权,通过AOP实现了参数校验。 演示: 可自行注册账号,或使用后台查看权限账号 demo 密码 demo (后台入口登陆后显示) 兄弟项目: 本项目的亮点: 功能齐全,页面丰富,实现了小商城...
主要介绍了基于javascript简单实现对身份证的校验的相关资料,需要的朋友可以参考下
基于maven+springmvc+spring+mybatis+Bootstrap...还涉及到许多的开发细节:Bootstrap搭建页面,MyBatis逆向工程使用,@ResponseBody注解完成ajax,jquery前端校验,后端jsr303校验等 可以快速开发一个完整的crud功能
基于JavaWeb的期刊杂志管理系统_课程设计附课设报告。含有数据库文件和详细注释 使用JavaWeb开发的数据库显示界面的课程设计,支持数据分页查询以及期刊的模糊搜索,首页采用动态二维码生成进行校验,支持上传图片...
权限控制:基于token方式,禁用session 对各种不同异常进行了全局统一处理 使用lombok简化java代码,让源码更简洁,可读性高 mybatis未进行二次封装,原滋原味,简单sql采用注解,复杂sql采用Mapper.xml配置 ...
支持高效、标准化构建用例,可视化编辑测试数据,精细化校验结果数据和自动清理 DB 数据,可以有效降低人工录入用例数据的成本,同时支持 API 重写提高测试代码的可扩展可复用性,提供特有注解提高测试代码编排的...
3 同时使用了了hibernate提供的校验框架,对客户端数据进行校验! 4 Mybati数据库DAO层采用的是Mapper代理开发方法,输入映射采用的是POJO包装类型实现,输出映射采用了resultMap类型,实现了数据库多对一映射。 5 ...
数据库基于SQLite,实现了以下功能: 定时自动从代理IP网站提取代理到数据库中并判断该代理ip的位置。 多线程校验代理IP有效性,自动剔除无效代理。 提供了现成的随机去除一个有效代理IP的方法,并附送一个...