首页 > 其他分享 >Spring Boot Validation统一参数校验

Spring Boot Validation统一参数校验

时间:2024-04-17 16:12:22浏览次数:22  
标签:String Spring ApiResult Boot 必须 errorMsg 注解 Validation public

实现方式

  使用 @Validated注解配合参数校验注解, 比如:@NotEmpty对参数进行校验。然后对抛出的异常ControllerAdvice进行捕获然后调整输出数据。

1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2、添加注解

2.1 对整个Controller类内所有接口参数校验

@Validated
@RestController
public class TestController {

}

2.2 对单一接口的所有参数校验

@Validated
@RequestMapping("/test")
public void test(@NotEmpty String uuid,@NotEmpty String name){

}

2.3 json请求

@RequestMapping("/test")
public ApiResult json(@RequestBody @Validated Map<String,Object> params){
    return ApiResult.success();
}
抛出异常:
MethodArgumentNotValidException

2.4 表单提交请求

 

@GetMapping("/get")
public ApiResult get(@Validated @NotEmpty String uuid) {
    return ApiResult.success();
}

抛出异常:

BindException

 

2.5 表单提交请求(@RequestParam)

 

@GetMapping("/get")
public ApiResult get(@RequestParam @Validated @NotEmpty String uuid) {
    return ApiResult.success();
}

 

抛出异常:

 

ConstraintViolationException

3、全局异常处理

common-mvc模块内

/**
 * 统一异常处理
 */
@ControllerAdvice
public class ExceptionInterceptor {

    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseBody
    public ApiResult handleConstraintViolationException(ConstraintViolationException e) {
        String errorMsg = e.getConstraintViolations().stream()
                .map(cv -> cv == null ? "null" : cv.getPropertyPath() + ": " + cv.getMessage())
                .collect(Collectors.joining(", "));
        return ApiResult.failureWithCode(400, "参数异常:" + errorMsg);
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ApiResult handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        String errorField = e.getBindingResult().getFieldErrors().get(0).getField();
        String errorMsg = e.getBindingResult().getFieldErrors().get(0).getDefaultMessage();
        errorMsg = "[" + errorField + "]" + errorMsg;
        return ApiResult.failureWithCode(400, "参数异常:" + errorMsg);
    }

    @ExceptionHandler(BindException.class)
    @ResponseBody
    public ApiResult handleBindException(BindException e) {
        String errorField = e.getBindingResult().getFieldErrors().get(0).getField();
        String errorMsg = e.getBindingResult().getFieldErrors().get(0).getDefaultMessage();
        errorMsg = "[" + errorField + "]" + errorMsg;
        return ApiResult.failureWithCode(400, "参数异常:" + errorMsg);
    }

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ApiResult handleException(Exception e) {
        return ApiResult.failure(e.getMessage());
    }
}

4、常用校验注解

 

注解运行时检查
@AssertFalse 被注解的元素必须为false
@AssertTrue 被注解的元素必须为true
@DecimalMax(value) 被注解的元素必须为一个数字,其值必须小于等于指定的最小值
@DecimalMin(Value) 被注解的元素必须为一个数字,其值必须大于等于指定的最小值
@Digits(integer=, fraction=) 被注解的元素必须为一个数字,其值必须在可接受的范围内
@Future 被注解的元素必须是日期,检查给定的日期是否比现在晚
@Max(value) 被注解的元素必须为一个数字,其值必须小于等于指定的最小值
@Min(value) 被注解的元素必须为一个数字,其值必须大于等于指定的最小值
@NotNull 被注解的元素必须不为null
@Null 被注解的元素必须为null
@Past(java.util.Date/Calendar) 被注解的元素必须过去的日期,检查标注对象中的值表示的日期比当前早
@Pattern(regex=, flag=) 被注解的元素必须符合正则表达式,检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配
@Size(min=, max=) 被注解的元素必须在制定的范围(数据类型:String, Collection, Map and arrays)
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组, 那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验
@CreditCardNumber 对信用卡号进行一个大致的验证
@Email 被注释的元素必须是电子邮箱地址
@Length(min=, max=) 被注解的对象必须是字符串的大小必须在制定的范围内
@NotBlank 被注解的对象必须为字符串,不能为空,检查时会将空格忽略
@NotEmpty 被注释的对象必须为空(数据:String,Collection,Map,arrays)
@Range(min=, max=) 被注释的元素必须在合适的范围内 (数据:BigDecimal, BigInteger, String, byte, short, int, long and 原始类型的包装类 )
@URL(protocol=, host=, port=, regexp=, flags=) 被注解的对象必须是字符串,检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件

5、@Valid和@Validated的区别

参考 :https://www.jianshu.com/p/1dff31a1649d

 

 



标签:String,Spring,ApiResult,Boot,必须,errorMsg,注解,Validation,public
From: https://www.cnblogs.com/april-chen/p/18141008

相关文章

  • Spring API DOC未授权访问/SpringBoot Actuator 未授权访问测试方法
    插件安装需要先安装并配置java环境,然后在burpsuite中安装apikit插件 工具扫描1)在BurpSuite中抓取请求:你将在BurpSuite中的`Proxy`标签的`HTTPhistory`中看到所有通过代理发送的请求。2)使用APIkit进行测试:在BurpSuite中,发送想要测试的请求选择**DoAutoAPIscan**来发......
  • 微服务Spring Cloud17_微服务场景模拟4
    首先,我们需要模拟一个服务调用的场景。方便后面学习微服务架构 一、创建父工程微服务中需要同时创建多个项目,为了方便课堂演示,先创建一个父工程,然后后续的工程都以这个工程为父,实现maven的聚合。这样可以在一个窗口看到所有工程,方便讲解。在实际开发中,每个微服务可独立一个......
  • 基于K8s+Docker+Openresty+Lua+SpringCloudAlibaba的高并发秒杀系统——与京东淘宝同
    ​介绍基于K8s+Docker+Openresty+Lua+SpringCloudAlibaba的高并发高性能商品秒杀系统,本系统实测单台(16核32G主频2.2GHz)openresty(nginx)的QPS可高达6w并发,如果您需要应对100w的并发,则需要100w/6w=17台openresty服务器,17台服务器同时接收并处理这100w的并发流量呢?当然是商业......
  • bootmgfw.efi 是 Windows 操作系统中的一个关键文件,它是用于启动 UEFI(统一扩展固件接
    bootmgfw.efi是Windows操作系统中的一个关键文件,它是用于启动UEFI(统一扩展固件接口)计算机的WindowsBootManager。这个文件通常位于Windows安装的EFI系统分区(ESP)中的\EFI\Microsoft\Boot\目录下。在UEFI计算机上,bootmgfw.efi负责加载Windows操作系统的启动程......
  • springboot集成spark大数据
    1、特别申明,请注意JDK版本,最好用JDK1.8,用JDK17会导致很多报错2、导入pom依赖JDK1.8直接导入spark依赖就行。<dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.13</artifactId><version>3.4.1......
  • springboot多模块项目启动经历
    springboot多模块使用@目录springboot多模块使用前言大佬把项目权限给我了,我就先下下来看看学习一下一、识别二、maven配置1.安装maven三、加载刷新总结前言大佬把项目权限给我了,我就先下下来看看学习一下一、识别项目分为母模块和多个子模块,开始idea只是识别了最外层的pom......
  • 基于SpringWeb MultipartFile文件上传、下载功能
    在Web开发中,文件上传是一个常见的功能需求。Spring框架提供了MultipartFile接口,用于处理文件上传请求。MultipartFile可以代表一个多部分文件上传请求中的一个文件,提供了一系列方法用于获取文件的各种属性和内容,使得在后端处理文件上传变得十分方便。下面我们将介绍MultipartFile......
  • IDEA2023版本创建Spring项目只能勾选17和21却无法使用Java8的完美解决方案
    参考:https://www.jb51.net/program/308256k4b.htm方案一:替换创建项目的源我们只知道IDEA页面创建Spring项目,其实是访问springinitializr去创建项目。故我们可以通过阿里云国服去间接创建Spring项目。将https://start.spring.io/或者http://start.springboot.io/替换为https://......
  • Bootstrap-table 使用总结
    Bootstrap-table使用总结一、什么是Bootstrap-table?在业务系统开发中,对表格记录的查询、分页、排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有名的开源表格插件,在很多项目中广泛......
  • Command line is too long. Shorten command line for JooLunMallApiApplication or a
      在启动微服务项目的某个时候,一直启动不起来,报Commandlineistoolong.ShortencommandlineforApplicationoralsoforApplicatio,在网上查阅资料后,发现这个问题,是因为启动命令太长(就是main方法类)。  解决方法:  选择工具栏的Run并下拉选Run,之后会有个弹窗,选择......