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 初始化 ...
随机推荐
- 双11专刊|云原生数据仓库AnalyticDB支撑双11,大幅提升分析实时性和用户体验
简介:2021年双十一刚刚落幕,已连续多年稳定支持双十一大促的云原生数据仓库AnalyticDB,今年双十一期间仍然一如既往的稳定.除了稳定顺滑的基本盘之外,AnalyticDB还有什么亮点呢?下面我 ...
- [Ethereum] Gas Station Network (GSN) eip-1613 与 Gas Relay Network (GRN) eip-1077
在 Ethereum dapp 中,任何涉及状态改动的交易都需要消耗 Gas,这限制了很多没有钱包或者 ETH 的用户对 dapp 的采用. 理念 让非以太用户能够访问智能合约 (如dapps),允许 ...
- Ubuntu 通过本机代理修复 NuGet 还原 error NU1301 失败
在国内垃圾的网络环境下,我在虚拟机里面安装了 Ubuntu 系统,准备用来测试 MAUI 在 Linux 上的行为,然而使用 dotnet restore 构建时,提示 NU1301 失败.我通过配置 ...
- 笔记04_正确使用Heterogeneous元件
笔记04_正确使用Heterogeneous元件 1.出现错误的原因,就是一个元件的几个 部分没有分组.比如上一节创建的NE5532_HETE,当这个元件被调用两次或更多次时,存在若干个A,B部分,如 ...
- java引入jep实现四则运算包含负数且规范两位小数
1.在pom中引入依赖 <!--四则运算--> <dependency> <groupId>jep</groupId> <artifactId&g ...
- SAP集成技术(十二)SAP PO
集成工作的一个重要部分是基于流程的集成,而在SAP环境中实现接口需求的众所周知的产品是SAP Process Orchestration(以下简称SAP PO). 现代集成架构通常使用中央系统来控制和 ...
- Kubernetes(K8S)安装
Kubermetes (K8S) 安装 参考文档: 官方文档: https://kubernetes.io/zh-cn/docs/concepts/overview/components/#node- ...
- Golang csv操作
目录 csv读写 追加写入 追加写入封装 csv读写 封装成工具包 package utils import ( "encoding/csv" "fmt" &q ...
- Sublime-Text配置Less插件以及Sublime常用插件
在上一篇文章(node.js环境在Window和Mac中配置,以及安装cnpm和配置Less环境)中提到在Node.js中配置Less环境,今天介绍如何在Sublime中运用Less.默认已经下好了s ...
- Hugging Face 与 Wiz Research 合作提高人工智能安全性
我们很高兴地宣布,我们正在与 Wiz 合作,目标是提高我们平台和整个 AI/ML 生态系统的安全性. Wiz 研究人员 与 Hugging Face 就我们平台的安全性进行合作并分享了他们的发现. W ...