本次发表文章距上次发表已近有两月有余,原因是两月前离开了上家公司(离开原因可能会在年终终结叙述,本篇暂且忽略),来到了现在所在的京东集团,需要花时间熟悉环境和沉淀一下新的东西,因此写文章也暂时没那么勤奋了,不得不说这次是机遇也是对自己职业生涯的一次重要决定。

话说本篇内容主要分享的是自定义方法参数的验证,参数的基本校验在对外接口或者公用方法时经常所见,用过hibernate的验证方式的朋友一定不会陌生,读完本篇内容能够很好的帮助各位朋友对自定义参数验证方式有一定了解:

  • 自定义参数验证的思路
  • 实战参数验证的公用方法
  • aop结合方法参数验证实例

自定义参数验证的思路

对于自定义参数验证来说,需要注意的步骤有以下几步:

  1. 怎么区分需要验证的参数,或者说参数实体类中需要验证的属性(答案:可用注解标记)
  2. 对于参数要验证哪几种数据格式(如:非空、邮箱、电话以及是否满足正则等格式)
  3. 怎么获取要验证的参数数据(如:怎么获取方法参数实体传递进来的数据)
  4. 验证失败时提示的错误信息描述(如:统一默认校验错误信息,或者获取根据标记验证注解传递的错误提示文字暴露出去)
  5. 在哪一步做校验(如:进入方法内部时校验,或是可以用aop方式统一校验位置)

实战参数验证的公用方法

根据上面思路描述,我们首先需要有注解来标记哪些实体属性需要做不同的校验,因此这里创建两种校验注解(为了本章简短性):IsNotBlank(校验不能为空)和RegExp(正则匹配校验),如下代码:

复制代码
1 @Documented 2 @Retention(RetentionPolicy.RUNTIME) 3 @Target(ElementType.FIELD) 4 public @interface IsNotBlank { 5     String des() default ""; 6 }
复制代码
复制代码
1 @Documented 2 @Retention(RetentionPolicy.RUNTIME) 3 @Target(ElementType.FIELD) 4 public @interface RegExp { 5     String pattern(); 6 7     String des() default ""; 8 }
复制代码

然后为了统一这里创建公用的验证方法,此方法需要传递待验证参数的具体实例,其主要做的工作有:

  1. 通过传递进来的参数获取该参数实体的属性
  2. 设置field.setAccessible(true)允许获取对应属性传进来的数据
  3. 根据对应标记属性注解来验证获取的数据格式,格式验证失败直接提示des描述

这里有如下公用的验证方法:

复制代码
 1 public class ValidateUtils {  2  3     public static void validate(Object object) throws IllegalAccessException {  4         if (object == null) {  5             throw new NullPointerException("数据格式校验对象不能为空");  6         }  7         //获取属性列 8         Field[] fields = object.getClass().getDeclaredFields();  9         for (Field field : fields) { 10             //过滤无验证注解的属性11             if (field.getAnnotations() == null || field.getAnnotations().length <= 0) { 12                 continue;