前言
在项目开发交互过程中,难免会遇到一些数据校验。以校验客户端发送数据的合法性,对于一些非空校验,我们也许可以使用@NonNull,@NotNull 等注解,可是对于一些常规的,如手机号,身份证等等的校验,我们就还要判断处理每个请求的参数的合法性。
但是合法性的判断是难以避免的,我们是否可以精简工作量、提高工作效率呢。
思考
我们或许应该从@NonNull @NotNull等其他注解那里受到些启发。
我们或许可以结合正则表达式及注解对某些通用数据进行验证。
注解可以设置参数,我们可以设置参数为校验规则,通过枚举列举出来,同时也应该允许用户自定义正则等校验。
我们知道,注解有三种类型
RetentionPolicy.SOURCE
RetentionPolicy.CLASS
RetentionPolicy.RUNTIME。
SOURCE主要用于编译之前,编译过程中会被丢弃如@Override注解。
CLASS主要用于编译,运行时会被丢弃。
RUNTIME在源码,编译,运行时始终会存在。
可以利用反射,拿到具有特定注解的bean,并处理。所以我们定义的注解应该是RUNTIME类型。同时声明注作用范围为FIELD及PARAMETER。
实践
定义注解
1 | /** |
定义如上注解,nullable用来校验参数是否可空,默认不可以为空,false。
同时提供几种通用的正则校验,用枚举列出,如手机号码校验,身份证信息校验等等。
同时如果没有规定的正则表达式,可以让用户自定义自己的正则表达式。
另增加描述字段,用来说明这个paramer的用途。
定义常用正则枚举
1 | /** |
列出几种常用枚举。非空,特殊字符,中文,邮箱,IP,数字等等
枚举规则
定义了枚举,要定义它们的具体对应的方法,以便后续调用。
1 | /** |
实现及调用
基本数据都定义及处理好了,我们应该建立注解与方法之间的关联,RUNTIME类型的注解在程序运行时也会被保留,我们可以利用反射,拿到具体注解参数信息,进行相关处理。
1 | /** |
如上代码。
当然,到具体业务层,应该调用这个Service的valid方法去校验参数。
结论
可以看到,经过这样,我们可以把一些常用的校验通过这种方式封装,大大简化代码量,使业务层更注重业务。
这种也可以添加自己的通用类型,灵活性很强。
这个小小的简单工具最主要的就是利用了Java的反射机制。
以上。
今天就到这里啦,中秋节快乐~~