springBoot使用自定义注解实现复杂校验
目录
- 为什么使用?
- 前置条件
- 前置知识
- 注解的保留策略
- 注解的作用目标
- 其他
- 使用自定义注解
- 我的实体类定义
- 我的注解定义
- 我的注解校验
- 测试注解
- 易错、注意点
为什么使用?
在业务开发中,比如开发一个用户系统,使用NotBliank,NotNull等原生注解只能校验某个参数是不是为空。在实际的service中我们可能要写很多冗余的代码量,你要写很多if else,比如邀请码是不是为空,是不是符合六位,用户昵称规范(只由数字或者只有字母组成)。这种写法当然也可以实现,但是代码量会很复杂,而且冗余。当然这些代码你可以放到utils封装成工具类方法,但是没有自定义注解来的优雅与简洁。
前置条件
springboot 2.6.x
pom依赖
1 2 3 4 5 |
|
前置知识 注解的保留策略
@Retention(RetentionPolicy.SOURCE)
只存在源码中,即运行以后这个注解就没了。
注:一开始我也觉得这个注解没用,既然运行就没了,那我写这个有什么用。其实我们lombok的@Data注解就是这个类型的,在运行以后,Data注解生成了get、set方法以后就功成身退没有了。@Retention(RetentionPolicy.CLASS)
在字节码中存在这个注解,运行期间没有。
应用场景:
依靠这种类型的注解,在运行的时候生成一些代码,类似于Data注解,不过是更上一层的使用。@Retention(RetentionPolicy.RUNTIME)、
运行期间仍然存在,运行的时候可以通过反射去获取
注解的作用目标
格式:@Target(xxxx.xxx)
ElementType.TYPE
接口,类,枚举注解
ElementType.FIELD
字段、枚举的常量
ElementType.METHOD
方法
还有很多,我主要就用到这些
其他
@Documented注解,我理解的就是生成帮助文档javadoc
@Inherited注解,自动继承注解
使用自定义注解 我的实体类定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|
我的注解定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
我的注解校验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
测试注解
这是controller层的代码
1 2 3 4 5 |
|
易错、注意点
- 在controller层里面要是怕post方法,要加上@RequestBody。
- 你要想让你的类执行校验还有加上@Validated,只有有这个注解,类中的自定义注解才可以生效。