前言

  今天学习了使用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进行参数验证的更多相关文章

  1. 基于springboot的spring JSR validation 后台参数验证

    springboot集成JSR参数校验: 1. 导入maven <dependency> <groupId>org.springframework.boot</group ...

  2. C# 中参数验证方式的演变

    一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限 ...

  3. DUBBO参数验证

    public class ValidationParameter implements Serializable {           private static final long seria ...

  4. C# 中参数验证方式

    C# 中参数验证方式 一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空, ...

  5. Kotlin + Spring Boot 请求参数验证

    编写 Web 应用程序的时候,经常要做的事就是要对前端传回的数据进行简单的验证,比如是否非空.字符长度是否满足要求,邮箱格式是否正确等等.在 Spring Boot 中,可以使用 Bean Valid ...

  6. 参数验证 @Validated 和 @Valid 的区别

    来源:blog.csdn.net/qq_27680317/article/details/79970590 整编:Java技术栈(公众号ID:javastack) Spring Validation验 ...

  7. Dubbo -- 系统学习 笔记 -- 示例 -- 参数验证

    示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 参数验证 参数验证功能是基于JSR303实现的,用户只需标识JSR303标准的验证Annotation,并通过声明filter来 ...

  8. SpringBoot08 请求方式、参数获取注解、参数验证、前后台属性名不一致问题、自定义参数验证注解、BeanUtils的使用

    1 请求方式 在定义一个Rest接口时通常会利用GET.POST.PUT.DELETE来实现数据的增删改查:这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性 1 ...

  9. Java Bean Validation(参数校验) 最佳实践

    转载来自:http://www.cnblogs.com 参数校验是我们程序开发中必不可少的过程.用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的 ...

  10. [系列] go-gin-api 规划目录和参数验证(二)

    目录 概述 规划目录结构 模型绑定和验证 自定义验证器 制定 API 返回结构 源码地址 go-gin-api 系列文章 概述 首先同步下项目概况: 上篇文章分享了,使用 go modules 初始化 ...

随机推荐

  1. [GPT] 用 document.querySelector('.xxx') 选择下级的第二个 div 要怎么写

      要选择类名为 .xxx 的元素下的第二个子<div>元素,可以将 querySelectorAll()方法与CSS选择器一起使用. 以下是一个示例: const secondChild ...

  2. [Caddy2] cloudflare, acme: cleaning up failed: no memory of presenting a DNS record

    使用 cloudflare 做为 DNS 之后,使用 Caddy 申请 Lets Encrypt 证书. 有时在日志里会发现一系列的提示信息: acme: use dns-01 solver acme ...

  3. WPF 制作一个加密文件夹应用

    我有一个需求就是将我的一些文件夹的内容同步到网盘上面去.但是我是不信任现在的各个网盘的,网盘的数据被我认为是会被泄露的数据,我需要同步的文件夹中,可能存在隐私的数据.于是我就想到了将文件夹里面的内容进 ...

  4. dotnet OpenXML 继承组合颜色的 GrpFill 属性

    在 OpenXML 的颜色画刷填充,有特殊的填充是 GrpFill 属性,对应 OpenXML SDK 定义的 DocumentFormat.OpenXml.Drawing.GroupFill 类型 ...

  5. 六、Doris数据流与控制流

    目录: 数据查询 数据导入 元数据修改 1.查询 用户可使用MySQL客户端连接FE,执行SQL查询, 获得结果,查询流程如下: 分步说明: ① MySQL客户端执行DQL SQL命令. ② FE解析 ...

  6. NASM中的ALIGN ALIGNB SECTALIGN

    ALIGN与ALIGNB NASM中的ALIGN与ALIGNB是用来字节对齐的,它们接收2个参数,第一个参数是必须的,表示对齐的字节数(必须是2的幂),第二个参数是可选的,表示为了对齐而进行填充的内容 ...

  7. 🔥🔥httpsok-谷歌免费SSL证书如何申请

    httpsok-谷歌免费SSL证书如何申请 使用场景: 部署CDN证书.OSS云存储证书 证书类型: 单域名 多域名 通配符域名 混合域名 证书厂商: ZeroSSL Let's Encrypt Go ...

  8. 网络拓扑—DHCP服务配置

    目录 DHCP服务搭建 相关配置细节前提 安装DHCP服务 DHCP服务搭建 相关配置细节前提 系统:Windows Server 2003 IP网段:10.0.0.0/24 三台机子: 普通PC机 ...

  9. 稳定、省钱的 ClickHouse 读写分离方案:基于 JuiceFS 的主从架构实践

    Jerry 是一家位于北美的科技公司,利用人工智能和机器学习技术,简化汽车保险和贷款的比价和购买流程.在美国,Jerry 的应用在其所属领域排名第一. 随着数据规模的增长,Jerry 在使用 AWS ...

  10. Python:当函数做为参数时的技巧

    我们之前在<Python技法3: 匿名函数.回调函数.高阶函数>中提到,可以通过lambda表达式来为函数设置默认参数,从而修改函数的参数个数: import math def dista ...