springboot3使用validation进行参数验证
前言
今天学习了使用validation整合springboot进行字段的校验,体验下来感觉很不错,有了validation可以省下一大堆控制器里面的数据校验,例如前端发送了一个请求到我们后端,请求中包含的数据字段一般情况下都是通过前端校验过的然后发送到后端进行处理,但是考虑到整体后端代码的可靠性和健壮性,不能100%得相信前端发送来的数据(万一某些前端数据来自一些闲的没事的人发来搞事情的呢),所以为了整体系统的可靠性后端也要对发来的数据进行校验,避免后期不必要的麻烦。
那么言归正传,如果我们在控制器中加入大量的if进行数据校验,那么最终控制器(controller层)中的代码就会显得很臃肿,可读性降低,看起来也不够优雅,用validation就可以”优雅“地解决这个问题。
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.3'
id 'io.spring.dependency-management' version '1.1.4'
}
apply from: './father.gradle'
group = 'org.example'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
runtimeOnly 'com.mysql:mysql-connector-j'
//MP
// https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter
implementation 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.5'
//druid
// https://mvnrepository.com/artifact/com.alibaba/druid
implementation 'com.alibaba:druid:1.2.21'
//swagger
// https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
}
tasks.named('test') {
useJUnitPlatform()
}
这个脚本中,我导入了 implementation 'org.springframework.boot:spring-boot-starter-validation' 其版本由springboot进行管理。maven导入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
下面是要用到的类:
点击查看代码Result类
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Result<T> {
private int code;
private String msg;
private T data;
public static <T> Result<T> success(T data) {
return new Result<>(Code.SUCCESS, "请求成功", data);
}
public static <T> Result<T> failed(String msg) {
return new Result<>(Code.FAILED, msg,null);
}
}
点击查看代码code类
public class Code {
public static final int SUCCESS = 10100;
public static final int FAILED = 10101;
public static final int BUSY = 10102;
public static final int GRANT_ERR = 10103;
}
原本我们在校验前端发来的数据的时候需要在控制器中写很多if,现在我们可以这样写,这是dmeo:
@GetMapping("/get")
public Result<User> getUserBy(@Pattern(regexp = "^\\d*$",message = "id不合法") @RequestParam String id) {
return Result.success(userMapper.selectById(id));
}
我们在字段前面加上 @Pattern(regexp = "^\\d*$",message = "id不合法") 我们用正则表达式进行参数的校验,当然这只是validation的其中一个注解,如果前端发来的参数可以成功匹配表达式,那么程序继续执行,如果不能,则会抛出异常,如果是在控制器中对参数进行校验会抛出HandlerMethodValidationException异常(实验得知),但如果是在实体类中的参数上面加上validation的注解,在请求体参数使用@Valid注解则会抛出MethodArgumentNotValidException异常,例如下面的方法会抛出MethodArgumentNotValidException异常:
@PostMapping("/save")
public Result save(@Valid @RequestBody User user){
userMapper.insert(user);
return Result.success(null);
}
点击查看代码User实体
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
@Size(min = 18, max = 18, message = "身份证长度不正确")
private String idcard;
@Size(min = 2,message = "姓名至少两个字")
private String name;
@Past(message = "出生日期必须是过去时间")
private java.sql.Date birth;
@Pattern(regexp = "^[男女]$",message = "性别只能是男或女")
private String sex;
@Positive(message = "年龄必须是正整数")
@Max(value = 120,message = "年龄不能超过120岁")
private Integer age;
@TableId
@Positive(message = "工号整数")
private Integer worknum;
}
tips:validation注解一般用于controller层和实体类属性上
那如何处理未验证通过的请求呢?下面给出一个异常捕获器的处理方式,将message中的错误信息返回给前端:
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result exceptionHandler(MethodArgumentNotValidException exception){
List<ObjectError> allErrors = exception.getAllErrors();
StringBuilder stringBuilder=new StringBuilder();
for (ObjectError error : allErrors) {
stringBuilder.append(error.getDefaultMessage()).append("\n");
}
return Result.failed(stringBuilder.toString());
}
这是MethodArgumentNotValidException异常处理器也就是异常信息由实体类属性校验产生(本人这么理解,如有错误望指正);HandlerMethodValidationException处理的代码几乎与以上一样;处理的方式可以多种样具体处理方式可以看业务的具体需求,当然也可以不给出那么详细的错误信息,校验失败直接抛给全局异常处理器返回BAD_REQUEST信息,这样也会减轻一些工作量。
springboot3使用validation进行参数验证的更多相关文章
- 基于springboot的spring JSR validation 后台参数验证
springboot集成JSR参数校验: 1. 导入maven <dependency> <groupId>org.springframework.boot</group ...
- C# 中参数验证方式的演变
一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限 ...
- DUBBO参数验证
public class ValidationParameter implements Serializable { private static final long seria ...
- C# 中参数验证方式
C# 中参数验证方式 一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空, ...
- Kotlin + Spring Boot 请求参数验证
编写 Web 应用程序的时候,经常要做的事就是要对前端传回的数据进行简单的验证,比如是否非空.字符长度是否满足要求,邮箱格式是否正确等等.在 Spring Boot 中,可以使用 Bean Valid ...
- 参数验证 @Validated 和 @Valid 的区别
来源:blog.csdn.net/qq_27680317/article/details/79970590 整编:Java技术栈(公众号ID:javastack) Spring Validation验 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 参数验证
示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 参数验证 参数验证功能是基于JSR303实现的,用户只需标识JSR303标准的验证Annotation,并通过声明filter来 ...
- SpringBoot08 请求方式、参数获取注解、参数验证、前后台属性名不一致问题、自定义参数验证注解、BeanUtils的使用
1 请求方式 在定义一个Rest接口时通常会利用GET.POST.PUT.DELETE来实现数据的增删改查:这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性 1 ...
- Java Bean Validation(参数校验) 最佳实践
转载来自:http://www.cnblogs.com 参数校验是我们程序开发中必不可少的过程.用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的 ...
- [系列] go-gin-api 规划目录和参数验证(二)
目录 概述 规划目录结构 模型绑定和验证 自定义验证器 制定 API 返回结构 源码地址 go-gin-api 系列文章 概述 首先同步下项目概况: 上篇文章分享了,使用 go modules 初始化 ...
随机推荐
- Dubbo-go v3.0 正式发布 ——打造国内一流开源 Go 服务框架
简介:Dubbo-go 是常新的,每年都在不断进化.介绍 Dubbo-go 3.0 工作之前,先回顾其过往 6 年的发展历程,以明晰未来的方向. 作者 | 李志信 来源 | 阿里技术公众号 作者 ...
- Quick BI:降低使用门槛,大东鞋业8000家门店的数据导航
简介: 通过引入MaxCompute和Quick BI,大东解决了以往数据查询即刻导致数据库闪崩的状况,还搭建起完善的报表体系,稳定应对高频.高并发的数据分析. 大东鞋业一季大约有500款的新品.大区 ...
- Linux内核社区迁移到github?
简介: github是目前最火的开源软件代码托管平台,那么Linux内核社区能否迁移到github上呢?Intel的Daniel Vetter写了一篇关于这个问题的博客,他给出的答案是NO.至于这个答 ...
- Region-区域(默认和新增)适配器
Prism内置了几个区域适配器 ContentControlRegionAdapter ItemsControlRegionAdapter SelectorRegionAdapter ComboBox ...
- dotnet 解析 TTF 字体文件格式
在 Windows 下,可以使用 DX 提供的强大能力,调用 DX 读取 TTF 字体文件,获取字体文件的信息以及额外的渲染信息.特别是基于 DX 的 WPF 更是加了一层封装,使用 FontFami ...
- Vue3 和 Vue2 的异同及开发中具体区别
目录 总体来说 性能提升 树摇(Tree shaking) 碎片化节点(Fragment) 传送门 (Teleport) Suspense 更好的TypeScript支持 Composition AP ...
- C++多态与虚拟:Objects 实例化(Objects Instantiation)探究
一.Objects的创建 依据已有的class CPoint ,我们可以产生一个或多个object(对象),或者说是产生一个instance(实体): CPoint aPoint(7.2); // a ...
- CF-943(已更B-E)
CF- 943(已更 B-E) D赛时没调出来(╬▔皿▔)╯,还有几分钟的时候反而把E过了,本来应该是上大分一场(⊙﹏⊙),等会会补G1 这假期要刷题,还要补文化课--后面有空的话更一下之前打的线下赛 ...
- 五、Doris数据分布
在 Doris 中,数据都以表(Table)的形式进行逻辑上的描述 名词解释 数据分布:数据分布是将数据划分为子集, 按一定规则, 均衡地分布在不同节点上,以期最大限度地利用集群的并发性能 短查询:s ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-43-分页测试
1.简介 分页测试,这种一般都是公共的方法系统中都写好了,这种一般出现是数据展示比较多的时候,会采取分页的方法,而且比较固定,一般是没有问题的,因此它非常适合自动化测试,但是如何使用playwrigh ...