全栈之路-小程序API-SpringBoot项目中参数校验机制与LomBok工具集使用
参数校验机制在web开发中是非常重要的,每当看到现在所在公司的校验代码,我都有头疼,每一个接口都是重新写参数的校验,有些复杂的接口,参数的校验甚至占了整个接口代码量的挺大一部分的,看着我都有些头疼,我知道可以优化,但是我并不知道该如何优化,正好,七月老师在这个项目中讲解到了这一部分,哈哈哈
一、参数校验机制探究
参数校验这个是非常重要的,如果把这个参数校验封装好了,那真的能节省很多代码,而且能够节省很多时间,这个还是非常重要的啊,这里分为参数的传递与参数的校验两部分内容
1、web开发中参数传递方式
在springboot中参数的传递基本上和springmvc中是类似的,就是基本上还是那几种的传递方式
(1)路由中的参数
举例说明:/v1/banner/test/2 (获取这个路由中的2这个参数)
在path路径中的参数是可以通过@PathVariable注解来获取的,注意这个可以做一个映射,参数的名的对应
@GetMapping("/test/{id}")
public String test(@PathVariable(name = "id") Integer id) {
diana.r();
throw new ForbiddenException(10001);
}
(2)路由中的?后面的参数
举例说明:/v1/banner/test/2?name=ssc (在后台中获取name参数的数值)
这中类型的参数的获取是利用@RequestParam注解来实现值得获取的,这个就比较简单了
@GetMapping("/test/{id}")
public String test(@PathVariable(name = "id") Integer id, @RequestParam String name) {
diana.r();
throw new ForbiddenException(10001);
}
(3)获取json格式的参数
也可以说是获取对象类型的参数,我们后台处理的时候使用对象接收的,但是在页面中进行传递的时候是json格式的参数,这里有一个新的概念,那就是DTO(Data Transfer Object)也就是数据传输对象,之后所有的参数传输对象我们都会用这种统一的格式进行传递
# DTO例子:(省略get/set方法)
public class PersonDTO { private String name;
private Integer age;
}
# 如何应用DTO对象来进行参数的传输
这里使用@RequestBody注解进行参数的传输的,用的是数据传输对象PersonDTO来接收参数的
@PostMapping("/test")
public String test(@RequestBody PersonDTO person) {
diana.r();
throw new ForbiddenException(10001);
}
2、参数校验机制和自定义校验
(1)基础验证注解
# 基础的注解就是一些SDK中提供的注解,使用的时候一定要在类上添加@Validated注解,组合使用才能起到作用,否则如果不加上这个注解,是没有作用的
# http body中参数和级联验证中,这个是稍微复杂一点的业务了,在对象中还有一个属性是对象类型的,这个的验证问题就也不是很复杂
(2)自定义校验注解
说明:这里以比较两次输入的密码是否相同来举例,写一个自定义的注解,来实现该功能
# 首先创建两个属性password1和password2,在PersonDTO类中进行创建的,这里使用了lombok的功能注解,简化getter/setter的代码
@Builder
@Getter
public class PersonDTO { @Length(min = 2, max = 10, message = "name长度在2~10之间")
private String name;
private Integer age; private String password1;
private String password2;
}
# 然后创建@PasswordEqual注解,这里需要添加两个特定的属性
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface PasswordEqual { String message() default "passwords are not equals"; // 自定义验证注解需要默认增加这两个模板方法的
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
注意:注解只是一个标记,我们不可以在注解中实现业务逻辑代码,自定义注解是有一个专门的关联类来实现业务逻辑代码的,这是如何进行实现的呢
# 创建自定义注解的关联类
public class PasswordValidator implements ConstraintValidator<PasswordEqual, PersonDTO> { // 泛型中第二个是自定义注解修饰的目标类 @Override
public boolean isValid(PersonDTO personDTO, ConstraintValidatorContext constraintValidatorContext) {
String password1 = personDTO.getPassword1();
String password2 = personDTO.getPassword2();
boolean match = password1.equals(password2);
return match;
} }
注意:注解和关联类是通过@Constraint注解进行组合在一起的,具体的做法就是在自定义注解中添加一个@Constraint注解指定PasswordValidator类的元类class
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Constraint(validatedBy = PasswordValidator.class)
public @interface PasswordEqual { String message() default "passwords are not equals"; // 自定义注解需要默认增加这两个模板方法
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
## 这里设计的很巧妙的,在Java中这种编程模式是很优秀的,springboot中应用了很多这种优秀的编程模式,很清晰,代码可维护性很强
# 获取自定义校验注解的参数
在自定义注解中难免会有一些参数,就是在使用自定义注解的时候,我们会添加一些参数,那么如何在关联类中处理这些参数呢?首先我们应该获取到这些参数,重写initialize方法
public class PasswordValidator implements ConstraintValidator<PasswordEqual, PersonDTO> { // 泛型中第二个是自定义注解修饰的目标的类型 private int min;
private int max; @Override
public void initialize(PasswordEqual constraintAnnotation) {
this.min = constraintAnnotation.min();
this.max = constraintAnnotation.max();
} @Override
public boolean isValid(PersonDTO personDTO, ConstraintValidatorContext constraintValidatorContext) {
String password1 = personDTO.getPassword1();
String password2 = personDTO.getPassword2();
boolean match = password1.equals(password2);
return match;
} }
二、LomBok工具集的使用
1、lombok在项目中安装
这个直接就安装在pom.xml文件中就可以了,在pom/xml文件中引入lombok的依赖,但是在idea中查看类的机构的时候,如果不安装lombok的插件的话,是很不方便的,建议在idea中安装一个lombok的插件
# pom.xml文件中引入(这里没有写版本号,maven自动安装完成就可以了)
<!--lombok maven 依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
# IDEA中安装lombok插件(直接在plugins插件市场中搜索就可以,直接安装)
## 安装完之后,还需要设置一个地方,具体就是:
这样的话,在查看对象的类结构的时候,当我们使用lombok中的注解的时候,我们就可以正常的看到具体的属性本质是什么样子了
注意:关于在IDEA中如何查看Structure工具栏,是通过view ---> Tool windows ---> Structure这样查看的
2、lombok中注解的学习
(1)@Getter/@Setter注解
这两个注解就是针对代码中的get/set方法进行简化的
(2)constructor构造方法注解
## @AllArgsConstructor 全参数构造方法
## @NoArgsConstructor 无参数构造方法
## @RequiredArgsConstructor 部分参数构造器
(3)@Builder注解构造器模式
这个使用的方法其实也是很简单的,但是有些需要注意的地方,先看一下这个注解是如何使用的
@Builder
public class PersonDTO {
private String name;
private Integer age;
}
PersonDTO personDTO = PersonDTO.builder()
.name("ssc")
.age(18)
.build();
具体对象创建的时候,我们只能使用builder这种方式进行构建,不能通过无参数的构造方法进行构建,因为在给一个对象加上@Builder注解之后,这个对象的无参数的构造方法会被变成私有的,无法使用
解决办法:继续给这个对象添加注解@Setter和@NoArgsConstructor注解,使其能够无参数构造
还有一个问题,那就是当这个数据传输对象作为结果返回的时候,我们是需要在加上@Getter注解的,这样的话,才能成功将这个对象进行序列化,前端页面才能成功的将这个结果进行接收
内容出处:七月老师《从Java后端到全栈》视频课程
七月老师课程链接:https://class.imooc.com/sale/javafullstack
全栈之路-小程序API-SpringBoot项目中参数校验机制与LomBok工具集使用的更多相关文章
- springboot项目--传入参数校验-----SpringBoot开发详解(五)--Controller接收参数以及参数校验----https://blog.csdn.net/qq_31001665/article/details/71075743
https://blog.csdn.net/qq_31001665/article/details/71075743 springboot项目--传入参数校验-----SpringBoot开发详解(五 ...
- 微信小程序api拦截器
微信小程序api拦截器 完美兼容原生小程序项目 完美兼用小程序api的原本调用方式,无痛迁移 小程序api全Promise化 和axios一样的请求方式 小程序api自定义拦截调用参数和返回结果 强大 ...
- 微信小程序开发——连续快速点击按钮调用小程序api返回后仍然自动重新调用的异常处理
前言: 小程序开发中诸如获取用户手机号码.调起微信支付.领取卡券等api都是会有一定的延迟的.也就是说通过点击按钮调用这些api的时候,从点击按钮调用api,到支付页面或者领取卡券界面展示出来是需要一 ...
- 小程序开发之scroll-view中id不能以数字开头的问题
在实现这样的一个功能时, 调用微信小程序api发现scroll中可以通过id来实现点击菜单栏,屏幕滚动到对应的id位置 但是id不能以数字,汉字类型的 字符串开头(暂发现两种),可能博主比较笨,想 ...
- C蛮的全栈之路-序章 技术栈选择与全栈工程师
目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 博主背景 985院校毕业,至今十年C++开发工作经验, ...
- Python全栈之路----常用模块----hashlib加密模块
加密算法介绍 HASH Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...
- 绝版Node--Sequlize搭建服务(Node全栈之路)
绝版Node--Sequlize搭建服务(Node全栈之路) 参考资料:https://itbilu.com/nodejs/npm/VkYIaRPz-.html 准备环境:Mysql,Node 前沿: ...
- C蛮的全栈之路-node篇(二) 实战一:自动发博客
目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 ---------------- 我是分割线 ---- ...
- C蛮的全栈之路-node篇(一) 环境布置
目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 ---------------- 我是分割线 ---- ...
随机推荐
- 最小环(floyd以及dijkstra实现+例题)
最小环定义 最小环是指在一个图中,有n个节点构成的边权和最小的环(n>=3). 一般来说,最小环分为有向图最小环和无向图最小环. 最小环算法: 直接暴力: 设\(u\)和\(v\)之间有一条边长 ...
- 基于 Istio 与 Kubernetes 对应用进行灰度发布与 Tracing
灰度发布,是指在黑与白之间,能够平滑过渡的一种发布方式.通俗来说,即让产品的迭代能够按照不同的灰度策略对新版本进行线上环境的测试,灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以对新版本进行测试 ...
- 并发队列之LinkedBlockingQueue
上一篇我们看了一下这个队列ConcurrentLinkedQueue,那就是一个无界非阻塞链表,我们这次来看看LinkedBlockingQueue,这个队列看名字就知道是一个阻塞式队列(也就是一个单 ...
- DOCKER 学习笔记4 认识DockerCompose 多容器编排
前言 通过上一节的学习,学会了如何在Linux 环境下搭建Docker并且部署Springboot 项目,并且成功的跑了起来,当然,在生产环境中,不只是需要一个后端的Web 项目,还需要比如 Ngin ...
- [python]getpass模块
python3的input函数不能隐藏用户输入,可以用getpass模块的getpass方法获取用户输入的时候用于隐藏显示密码. *需要注意的是该方法在IDE中看不到隐藏效果,在内置IDLE中会有Ge ...
- Chrome恢复显示网址 https:// 和 www
文章来自我的博客: https://blog.ljyngup.com/archives/686.html/ Chrome这个新规弄得我也很蛋疼,每次一点输入框就突然突出来一下.后来在Hostloc论坛 ...
- 如何用一月6RMB搭建一个国外服务器
转载自我的博客:https://blog.ljyngup.com 前言 本文将教你如何用一月6RMB的价格搭建一个属于个人的外国服务器.并且一月500G流量,延迟低于500ms. 开始 导航:Virm ...
- SqlServer触发器的基础知识
触发器的基础知识:create trigger tr_name on table/view{for | after | instead of } [update][,][insert][,][dele ...
- MongoDB oplog 详解
oplog 简介 oplog 是local库下的一个固定集合,Secondary就是通过查看Primary的oplog这个集合来进行复制的.每个节点都有oplog,记录从主节点复制过来的信息,这样每个 ...
- python 安装自己下载的whl依赖
下载好之后保存到相应的地方,如下载了xxxx.whl文件并将它保存在D:\python\project目录下,然后 pip install D:\python\project\xxxx.whl即可