目录

1. 添加依赖

2. 检查POJO类型的请求参数

3. 关于响应的消息文本

4.  快速失败

5. 检查未封装的请求参数


1. 添加依赖

pom.xml中添加spring-boot-starter-validation依赖项:

<!-- Spring Boot Validation框架,用于检查数据格式 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2. 检查POJO类型的请求参数

首先,在POJO参数前添加@Valid@Validated注解,用于表示此参数是需要通过Validation框架进行检查的!

例如:

@ApiOperation("添加相册")
@PostMapping("/add-new")
//                       ↓ 新添加的注解
public JsonResult addNew(@Valid AlbumAddNewDTO albumAddNewDTO) {albumService.addNew(albumAddNewDTO);return JsonResult.ok();
}

然后,在此参数的属性上添加检查注解,例如添加@NotNull注解,表示将对此属性进行检查,此属性的值不允许为null

@Data
public class AlbumAddNewDTO implements Serializable {@ApiModelProperty(value = "相册名称", required = true)@NotNull // 新添加的注解private String name;// 省略后续代码

完成后,重启服务,通过API文档提交请求时,故意不提交name(将对应的输入框删除),则服务器端尝试接收的name就会是null,无法通过@NotNull的检查规则,默认将出现400错误,例如:

{
  "timestamp": "2022-12-01T06:38:26.020+00:00",
  "status": 400,
  "error": "Bad Request",
  "path": "/album/add-new"
}

并且,在服务器端的控制台会提示以下错误:

2022-12-01 14:38:26.017  WARN 10708 --- [io-9080-exec-10] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors<EOL>Field error in object 'albumAddNewDTO' on field 'name': rejected value [null]; codes [NotNull.albumAddNewDTO.name,NotNull.name,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [albumAddNewDTO.name,name]; arguments []; default message [name]]; default message [不能为null]]

可以看到,当检查不通过时,将出现org.springframework.validation.BindException异常!

ServiceCode中添加新的枚举值:

 * 错误:请求参数格式有误*/
ERR_BAD_REQUEST(400),

GlobalExceptionHandler中添加处理BindException异常的代码:

@ExceptionHandler
public JsonResult handleBindException(BindException e) {String message = "请求参数格式错误!";return JsonResult.fail(ServiceCode.ERR_BAD_REQUEST, message);
}

3. 关于响应的消息文本

所有检查注解都可以配置检查不通过后的提示文本,例如:

@NotNull(message = "必须提交相册名称")

在处理异常时,应该将此处配置的文本响应到客户端去,可以通过异常对象获取以上文本!

由于客户端提交的若干个请求参数可能有多种错误,则异常对象中可能封装了多个错误信息!如果需要显示所有错误,应该先获取全部信息,然后将这些错误信息组织起来,并响应到客户端去!

所以,处理异常的代码可以调整为:

@ExceptionHandler
public JsonResult handleBindException(BindException e) {String delimiter = ",";String prefix = "添加相册失败,";String suffix = "!";StringJoiner stringJoiner = new StringJoiner(delimiter, prefix, suffix);List<FieldError> fieldErrors = e.getFieldErrors();for (FieldError fieldError : fieldErrors) {String defaultMessage = fieldError.getDefaultMessage();stringJoiner.add(defaultMessage);}return JsonResult.fail(ServiceCode.ERR_BAD_REQUEST, stringJoiner.toString());
}

4.  快速失败

Validation框架有快速失败的机制,默认是未开启的,当客户端提交的请求参数有多种错误时,会进行全部的检查,发现所有错误!如果开启快速失败,当检查出第1个错误时,就会停止检查!

配置快速失败,需要创建Valiator类型的对象,通过此对象进行配置,并且,此对象必须被保存在Spring容器中,框架会自动应用它!

当需要创建某个对象并使它保存在Spring容器中,可以在配置类中添加@Bean方法,此方法返回相关对象,在启动项目时,Spring框架会自动调用此方法并将返回保存在Spring容器中。

在项目的根包下创建config.ValidationConfiguration配置类,在此配置类中通过@Bean方法返回Validator对象,并在返回之前将此对象配置为快速失败的:

import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.validation.Validation;@Slf4j
@Configuration
public class ValidationConfiguration {public ValidationConfiguration() {log.debug("创建配置类对象:ValidationConfiguration");}@Beanpublic javax.validation.Validator validator() {return Validation.byProvider(HibernateValidator.class).configure() // 开始配置.failFast(true) // 配置快速失败.buildValidatorFactory() // 构建Validator工厂.getValidator(); // 从Validator工厂中获取Validator对象}}

当配置了快速失败后,无论请求参数有多少种错误,都会在发现第1个错误后停止检查,所以,处理异常时,只需要直接获取错误对象即可,不必获取所有错误对象!即:

@ExceptionHandler
public JsonResult handleBindException(BindException e) {StringBuilder stringBuilder = new StringBuilder();String prefix = "添加相册失败,";String suffix = "!";String defaultMessage = e.getFieldError().getDefaultMessage();stringBuilder.append(prefix).append(defaultMessage).append(suffix);return JsonResult.fail(ServiceCode.ERR_BAD_REQUEST, stringBuilder.toString());
}

5. 检查未封装的请求参数

如果某些请求的参数较少,或各参数并不相关,则不会将它们封装在一起,例如:

// http://localhost:9080/brand/delete
@PostMapping("/delete")
public void delete(Long id) {
}

当需要检查这类参数时,首先,需要在当前类上添加@Validated注解,例如:

@RestController
@RequestMapping("/brand")
@Validated // 新添加的注解
public class BrandController {// 省略其它代码

然后,在请求参数上添加检查注解,例如:

// http://localhost:9080/brand/delete
@PostMapping("/delete")
//                 ↓ 新添加的注解
public void delete(@Range(min = 1, max = 996) @RequestParam Long id) {
}

**提示:**以上@RequestParam在此处并无实际意义,但是,不添加此注解的话,在线API文档的调试界面中不会出现此参数的输入框,所以暂时添加上此注解,后续将删除!

完成后,重启项目,在API文档中调整,如果提交的id参数值不在[1, 996]范围内,将出现500错误(注意:不要处理RuntimeException),则控制台会提示错误:

javax.validation.ConstraintViolationException: delete.id: 需要在1和996之间

则应该在全局异常处理器添加对以上异常的处理:

@ExceptionHandler
public JsonResult handleConstraintViolationException(ConstraintViolationException e) {Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();String delimiter = ",";StringJoiner stringJoiner = new StringJoiner(delimiter);for (ConstraintViolation<?> constraintViolation : constraintViolations) {stringJoiner.add(constraintViolation.getMessage());}return JsonResult.fail(ServiceCode.ERR_BAD_REQUEST, stringJoiner.toString());
}

个人主页:居然天上楼

感谢你这么可爱帅气还这么热爱学习~~

人生海海,山山而川

你的点赞

【在SpringBoot项目中使用Validation框架检查数据格式】相关推荐

  1. 【在SpringBoot项目中使用Validation框架检查数据格式-常用的检查注解】

    常用的检查注解 使用Validation框架检查数据格式时,常用的检查注解有: @NotNull:不允许为null值 可用于任何类型的参数 @NotEmpty:不允许为空字符串,即长度为0的字符串 仅 ...

  2. 使用Validation框架检查数据格式

    1. 添加依赖 在pom.xml中添加spring-boot-starter-validation依赖项: <!-- Spring Boot Validation框架,用于检查数据格式 --&g ...

  3. SpringBoot12 QueryDSL01之QueryDSL介绍、springBoot项目中集成QueryDSL、利用QueryDSL实现单表RUD、新增类初始化逻辑...

    1 QueryDSL介绍 1.1 背景 QueryDSL的诞生解决了HQL查询类型安全方面的缺陷:HQL查询的扩展需要用字符串拼接的方式进行,这往往会导致代码的阅读困难:通过字符串对域类型和属性的不安 ...

  4. 在Spring Boot项目中使用Spock框架

    转载:https://www.jianshu.com/p/f1e354d382cd Spock框架是基于Groovy语言的测试框架,Groovy与Java具备良好的互操作性,因此可以在Spring B ...

  5. pycharm项目中如何安装包_如何将Thymeleaf技术集成到SpringBoot项目中

    给天气预报一个"面子" 截至目前,不仅有了天气预报的API接口,也有了数据的缓存方案.现在,就要进行天气预报服务的实现,也就是说,这里需要一个面向用户的应用.这个应用应该拥有友好的 ...

  6. 基于springboot项目中使用docker-compose+es+kibana+logstash+mysql 提高数据查询效率

    基于springboot项目中使用docker-compose+es+kibana+logstash+mysql 提高数据查询效率 1.拉取logstash,kibana,es,mysql镜像 #命令 ...

  7. 关于webservice服务在springboot项目中的开发的介绍

    在springboot项目中搭建webservice服务端及使用客户端进行请求的介绍 一.引包 二.搭建webservice服务 (一)使用CXF搭建webservice服务 (二)webservic ...

  8. 通过Validation框架检查请求参数的基本格式

    通过Validation框架检查请求参数的基本格式 1.1. 添加依赖 Spring Validation框架可用于在服务器端检查请求参数的基本格式(例如是否提交了请求参数.字符串的长度是否正确.数字 ...

  9. java 定时任务怎么关闭_浅谈springboot项目中定时任务如何优雅退出

    在一个springboot项目中需要跑定时任务处理批数据时,突然有个Kill命令或者一个Ctrl+C的命令,此时我们需要当批数据处理完毕后才允许定时任务关闭,也就是当定时任务结束时才允许Kill命令生 ...

最新文章

  1. android2.2
  2. 自已写的几个分页的存储过程
  3. 对象集合中如何用对象的某个属性给对象排序?
  4. [Leetcode]@python 90. Subsets II.py
  5. 找软件开发开发工作_将求职变成开发项目
  6. 5分钟速成C++14多线程编程
  7. 如何分析风控核心报表,指标背后代表怎样的逻辑
  8. Python模块的导入方法1
  9. 用python写WordCount的MapReduce代码
  10. java语法和python语法的一些区别
  11. C++萌新来看,一篇文让你让你彻底搞定类(超详细)!
  12. 详解 torch.max 函数
  13. springboot no tests were found
  14. typescript中this报错
  15. 掌握 Dojo 工具包
  16. TCP 漕河泾算法(tcp_caohejing)
  17. 强化学习在文本生成nlg上的作用
  18. 大数据技术与应用4-4MapRuduce
  19. C#日历calendar.cs
  20. 下采样matlab代码,SIFT中的降采样和升采样及其MATLAB实现

热门文章

  1. Base64在线加密解密
  2. Python简单词云的制作
  3. win10睡眠模式 屏幕熄灭主机仍然运行
  4. gitbash EndNote Snipaste Wox+Everything 火狐 火绒浏览器 Bandizip
  5. 学生选课系统业务需求
  6. 美团笔试题 淘汰分数
  7. Java实现无向连通图中的“割点”问题
  8. matlab 正态输入信号,用matlab或者spss做正态检验(转载)
  9. inno setup 自定义生成的卸载程序
  10. 桂电计算机系入学怎么分班,桂电研究生-()学期课程总表