# param-validate **Repository Path**: a114533627/param-validate ## Basic Information - **Project Name**: param-validate - **Description**: 此项目是一个面向切面编程的方式实现方法参数的校验的工具。主要用在用spring开发的项目中,做请求参数的校验。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-07-15 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # param-validate #### 项目介绍 此项目是一个面向切面编程的方式实现方法参数的校验的工具。主要用在用spring开发的项目中,做请求参数的校验。 ##### 开发param-validate的原因: 通常,我们在javaee项目中,开发api时,如果没有做好参数校验,前后端工程师在对接的时候,经常会因为传参不合法,报一些奇奇怪怪的异常,这时需要后端工程师打断点去分析异常的原因,浪费大量的时间,而且前后端工程师在出现问题时,在责任上有可能互相推倭。而做好参数校验,能够提高api健壮性和易用性,保证api交互数据的正确性和合法性,减少前端后端工程师在对接api时间上的浪费,提高整个项目开发效率。 那么怎么做好参数校验呢?如果针对每一个参数,都编码去校验,代码量很大,也很繁琐。比如一个入参a,要求不能为空,是数值型的,并且取值范围是0-100。要编码校验的代码如下: ``` if(a==null ||a==’’){ return 返回不能为空的提示。。。。。 } If(!a.maches(“^\\d+$”){ Retrun 返回不是数值型的提示。。。。 } If(Integer.valueOf(a)<0 && Integer.valueOf(a)>100){ Return 返回不在0-100范围的提示 } ``` 一个参数的校验就用了好几行的代码,是不是很麻烦呢?有没有更好的办法? 另外,如果我们用的是springMvc做Controller层框架,如果使用它的参数自动注入,如果传的参数类型不对,出现转换异常时,方法就得不到执行,那个这次请求就得不到正常的响应。如下图: ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/101204_94c7bcd5_1339570.png "1.png") ##### 解决以上问题的思路: 1. 要想controller层得到正确的返回,那个controller层就不能再向上抛出异常,controller层应该处理所有异常。 2. 要防止controller层的方法在参数注入时因类型不匹配抛出异常,那么,只能把从request对获取的请求参数,传到service层去校验和处理。从request对象中获取参数,放入Map集合的方法很简单,我们可以写一个工具类。代码如图 ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/101305_f04147cd_1339570.png "2.png") 3. 在controller层把请求参数传到service层,在service层去校验。 ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/101402_2c331e13_1339570.png "3.png") 4. 利用spring 的aop,面向切面编程,可以把参数校验用一个切面去完成。当参数校验通过,正常执行service层的方法。当参数校验通不过时,抛出运行异常(异常中包含提示信息),这时,cotroller层捕获异常,并返回相应提示。 如图: ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/101531_c387f876_1339570.png "32.png") #### 软件架构 软件架构说明 #### 安装教程 1. 将此项目下载到本地 2. 用maven安装到本地仓库即可 #### 使用说明 1. 引入param-validate.2.0.jar,及依赖jar(spring-context\javassist\aspectjweaver) 注意:还有spring aop 的一些依赖(这里省略),参数校验工具类的使用,首先必须得保证spring的aop的功能是正常的。 ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/101842_a68ff047_1339570.png "4.png") 2. 配置自动代理,和包扫描 ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/101910_510db9d0_1339570.png "5.png") 3. 在需要参数校验的方法上加注解 例1:验证map里面的key, Key对应的valuei 不允许为空 ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/102020_3390b0c2_1339570.png "6.png") 例2:验证map里面的key。 Key对应的value允许为空 ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/102041_baf04dc2_1339570.png "7.png") - 附:注解说明 ``` @validateGroup()是个组合注解,它的属性fileds是个@validateFiled类型的数组。 @validateFiled的属性说明: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface ValidateFiled { /** * 参数索引位置 */ public int index() default -1 ; /** *如果参数是对象,要验证对象里面某个属性,就用该参数指定对象中的属性名 */ public String filedName() default "" ; /** * 如果参数是Map,要验证Map里面某键值,就用该参数指定key */ public String key() default "" ; /** * 正则验证 */ public String regStr() default ""; /** * 是否能为空 , 为true表示不能为空 , false表示能够为空 */ public boolean notNull() default false; /** * 最大长度,字符串的最大长度 */ public int maxLen() default -1 ; /** * 最小长度 ,字符串的最小长度 */ public int minLen() default -1 ; /** *最大值 ,用于验证数字类型数据 ,如果是非数值,会给出相应提示 */ public int maxVal() default -1 ; /** *最小值 ,用于验证数值类型数据 ,如果是非数值,会给出相应提示 */ public int minVal() default -1 ; /** * * @Description: 列举出允许的字符串值 */ public String[] strVals() default {} ; /** * * @Title: intVals * @Description: 列举出允许的整数值 */ public int[] intVals() default {} ; } ``` #### 效果演示 例1:验证map里面的key, Key对应的value不允许为空 ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/102347_ed3a3baa_1339570.png "8.png") ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/102355_572ca8f2_1339570.png "9.png") 例2:验证map里面的key。 Key对应的value允许为空 ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/102416_e4e9b303_1339570.png "10.png") ![输入图片说明](https://images.gitee.com/uploads/images/2018/0715/122316_57b876ca_1339570.png "111.png") #### 参与贡献 #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [http://git.mydoc.io/](http://git.mydoc.io/) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)