springboot引入校验注解

news2024/12/23 3:40:41

引入依赖

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
  </dependency>
      <dependency>
            <groupId>jakarta.validation</groupId>
            <artifactId>jakarta.validation-api</artifactId>
            <version>2.0.1</version>
        </dependency>

常用校验注解

@Null(groups={Add.class}) 参数必须为null,group设置分组,默认为default
@NotNull 参数不为null
@NotEmpty 参数不为null 且不为空集合,集合不为空
@NotBlank 参数不为null且不为空串,只能作用字符串类型
@AssertFalse 被注释的元素必须是false
@AssertTrue 被注释的元素必须是true
@Min(value) 被注释的元素必须为一个数字 >=
@Max(value) 被注释的元素必须为一个数字 <=
@DecimalMin(“value”) >=
@DecimalMax(“value”) <=
@NegativeOrZero <=0
@Range(min,max) 被注释的元素大小必须在指定的范围内
@Size(min ,max) 被注释的元素大小必须在指定的范围内
@Email 被注释的元素必须是电子邮箱地址
@Past 被注释的元素必须是一个过去的日期
@PastOrPresent 被注释的元素必须是一个过去的时间
@Future 被注释的元素必须是一个将来的日期
@Pattern(regexp = “1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$”) 被注释的元素必须是符合指定的正则表达式
@URL 被注释的元素必须是链接地址

提示:除了@NotNull注解之外,其他参数校验注解只有参数不为空的时候才生效

一般校验注解都有一个message的属性,这个属性代表的是注解校验不通过时返回的错误提示。

在controller层方法参数使用校验注解

  1. 首先需要在controller类上面加上@Validated注解。
  2. 在参数前面加上校验注解。如@NotBlank(message = “名字不能为空”) String name

上述注解的包:
org.springframework.validation.annotation.Validated;
javax.validation.constraints.NotBlank;
注解参数:message,当不满足校验条件的时候会抛出ConstraintViolationException异常,异常中会包含该message对应的内容----名字不能为空。

import org.springframework.validation.annotation.Validated;
import java.util.*;

@RestController
@Validated
public class TestController extends JeecgController<Test, TestService> {
    @PostMapping(value = "/test")
    Result<?> test(@RequestBody @NotBlank(message = "名字不能为空") String name,
                   @NotNull(message = "年龄不能为空") @Max(value = 30,message = "最大不能超过30") @Min(value = 18,message = "最小不能小于18") Integer age) {
        return null;
    }
}

效果(已处理)

在这里插入图片描述

在controller层的DTO对象使用校验注解

  1. 首先需要在controller类上面加上@Validated注解。
  2. 在对象参数前面加上@Valid注解,并在对象内使用校验注解
  3. 如果对象参数内部还嵌套这其他对象,需要在对象属性上面加上@Valid注解(这条和第二条原理差不多)

不满足对象内的校验时,会抛出MethodArgumentNotValidException异常
上述注解的包:
org.springframework.validation.annotation.Validated;
javax.validation.Valid;

import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import java.util.*;

@RestController
@Validated
public class TestController extends JeecgController<Test, TestService> {
    @PostMapping(value = "/test")
    Result<?> test(@RequestBody @Valid TestDTO testDTO) {
        return testService.test(testDTO);
    }
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
@Data
@ApiModel(value = "testDTO")
public class TestDTO {
	@ApiModelProperty(value = "用户id",required = true)
	@NotBlank(message = "用户id不能为空")
	private String userId;

	@ApiModelProperty(value = "订单id列表",required = true)
	@Size(min = 1, message = "至少要选择一个订单")
	private List<String> orderIdList;

	@ApiModelProperty(value = "是否通知顾客",required = true)
	@NotNull(message = "是否通知顾客不能为空")
	private Boolean notifyCustomer;
}

效果(已处理)

在这里插入图片描述

校验失败返回

在这里插入图片描述

一般来说,项目都会定好响应体的结构,直接抛异常返回的信息和预期不太符合。
这个时候就需要我们来全局精准捕获该异常并处理异常信息,按照符合标准的方式返回。

@RestControllerAdvice
@Slf4j
public class ExceptionHandler {

    /**
     * 这个异常在校验不通过的时候就会抛出
     *
     * @param e
     * @return: Result<?>
     **/
    @ExceptionHandler({MethodArgumentNotValidException.class, ConstraintViolationException.class})
    public Result<?> handleMethodArgumentNotValidException(Exception e) {
        log.info("全局捕获校验注解异常e={}", e.getMessage());
        BindingResult bindingResult=null;
        Result<?> res= Result.ok();
        StringBuilder errorInfo = new StringBuilder();
        if(e instanceof MethodArgumentNotValidException){
            MethodArgumentNotValidException notValidException=(MethodArgumentNotValidException) e;
            bindingResult = notValidException.getBindingResult();
            List<FieldError> fieldErrorList= bindingResult.getFieldErrors();
            String msg = fieldErrorList.stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(","));
            return res.error511(msg);
        }else if(e instanceof ConstraintViolationException){
            ConstraintViolationException violationException=(ConstraintViolationException) e;
            Set<ConstraintViolation<?>> constraintViolations = violationException.getConstraintViolations();
            String msg = constraintViolations.stream().map(o -> String.valueOf(o.getMessage())).collect(Collectors.joining(","));
            return res.error511(msg);
        }else{
            return res.error511(e.getMessage());
        }
    }

处理后:
在这里插入图片描述
参考:https://blog.csdn.net/qq_42956993/article/details/129199922

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/887429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android音视频剪辑器自定义View实战!

Android音视频剪辑器自定义View实战&#xff01; - 掘金 /*** Created by zhouxuming on 2023/3/30** descr 音视频剪辑器*/ public class AudioViewEditor extends View {//进度文本显示格式-数字格式public static final int HINT_FORMAT_NUMBER 0;//进度文本显示格式-时间…

Nginx 解决api跨域问题

环境: nginx 1.22.1 宝塔8.0 php lavarel 在nginx里加入下面的设置 #这里填*就是任何域名都允许跨域add_header Access-Control-Allow-Origin "*";#CORS请求默认不发送Cookie和HTTP认证信息。但是如果要把Cookie发到服务器&#xff0c;要服务器同意&#xff0c…

web连接桌面打开gptmap

一&#xff1a;环境配置 需要的材料&#xff1a; python-3.10.4 我使用的是这个版本的&#xff0c;3.8.10 该版本和以下版本组件组合&#xff0c;验证过能正常运行&#xff08;python 3.6.8测试异常&#xff09; websockify 该项目有python版本和node js版本 noVNC 形式的app…

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——性质——第二节——并非命题

真题&#xff08;2012—52&#xff09;—性质—并非之后&#xff0c;所有有的互相变&#xff0c;必然可能互相变&#xff0c;肯定否定互相变。 52.近期流感肆虐&#xff0c;一般流感患者可采用抗病毒药物治疗&#xff0c;虽然并不是所有流感患者均需接受达菲等抗病毒药物的治疗…

excel之数学函数、excel中的通配符

学习excel前需要明确的是事&#xff1a;   在学习excel函数之前&#xff0c;大家需要明确一件事&#xff0c;excel现在设计到了一些新函数&#xff0c;这些新函数只能存在于office365、office2019及更 新版本之中&#xff0c;所以建议大家在学习时安装较新的版本&#xff0c;…

OLED透明屏采购指南:如何选择高质量产品?

着科技的不断进步&#xff0c;OLED透明屏作为一种创新的显示技术&#xff0c;在各个行业中得到了广泛应用。 在进行OLED透明屏采购时&#xff0c;选择高质量的产品至关重要。在这篇文章中&#xff0c;尼伽将为您提供一个全面的OLED透明屏采购指南&#xff0c;帮助您了解关键步…

区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测

区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测。基于分位…

详细整合Spring+SpringMVC+MyBatis+logback(SSM)项目

整体目录结构 表结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.a…

Java中List排序的4种方法

开发过程中经常会遇到读取文件内容的情况&#xff0c;需要判断文件是否为文本文件&#xff0c;及文件编码格式&#xff0c;防止无法读取内容或乱码出现情况。 我们可以通过 java.io.File 类包找出文件是目录还是常规文件。java.io.File 类包含两种方法&#xff0c;它们分别是&…

[机器学习]特征工程:主成分分析

目录 主成分分析 1、简介 2、帮助理解 3、API调用 4、案例 本文介绍主成分分析的概述以及python如何实现算法&#xff0c;后续会再出一篇关于主成分分析算法原理讲解的文章&#xff0c;敬请期待&#xff01; 感谢大家支持&#xff01;您的一键三连&#xff0c;就是我创作的…

深入解析 Axios Blob 的使用方法及技巧

在 Web 开发中&#xff0c;处理文件传输是一个常见的需求。Blob&#xff08;二进制对象&#xff09;是一种表示二进制数据的方式&#xff0c;常用于处理文件和多媒体数据。本文将介绍如何使用 Axios 和 Blob 来处理文件传输。 Axios Blob 概念 在开始之前&#xff0c;让我们先…

智慧水利利用4G物联网技术实现远程监测、控制、管理

智慧水利工业路由器是集合数据采集、实时监控、远程管理的4G物联网通讯设备&#xff0c;能够让传统水利系统实现智能化的实时监控和远程管理。工业路由器利用4G无线网络技术&#xff0c;能够实时传输数据和终端信息&#xff0c;为水利系统的运维提供有效的支持。 智慧水利系统是…

stm32_ADC电源、通道、工作模式

0、ADC功能框图 1、ADC的电源 1.1、工作电源 VSSAVSS&#xff0c;VDDAVDD&#xff0c;简单来说&#xff0c;通常stm32是3.3V&#xff0c;ADC的工作电源也是3.3V&#xff1b; 1.2、参考电压 VREF和VREF-并不一定引出&#xff0c;取决于封装&#xff0c;如果没有引出则VREF连接到…

Debian查询硬件状态

很早以前写过一个查询树霉派硬件状态的文章&#xff0c;用是Python写的一个小程序。里面用到了vcgencmd这个测温度的内部命令&#xff0c;但这个命令在debian里面没有&#xff0c;debian里只有lm_sensors的外部命令&#xff0c;需要安装&#xff1a;apt-get install lm_sensors…

ZLMediaKit推流测试

推流测试 ZLMediaKit支持rtsp/rtmp/rtp推流&#xff0c;一般通常使用obs/ffmpeg推流测试&#xff0c;其中FFmpeg推流命令支持以下&#xff1a; 1、使用rtsp方式推流 # h264推流 ffmpeg -re -i "/path/to/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transp…

STM32 CubeMX (Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)第二步

STM32 CubeMX STM32 CubeMX ____Freertos任务通信&#xff1a;队列、信号量、互斥量&#xff0c;事件组&#xff0c;任务通知 STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用…

最新ChatGPT网站AI系统源码+详细图文搭建教程/支持GPT4.0/AI绘画/H5端/Prompt知识库/

一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01…

LeetCode ——二叉树篇(三)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 二叉树的定义及创建见&#xff1a; LeetCode ACM模式——二叉树篇&#xff08;一&#xff09;_要向着光的博客-CSDN博客 目录 116. 填充每个节点的下一个右侧节点指针 117. 填…

(二)结构型模式:7、享元模式(Flyweight Pattern)(C++实例)

目录 1、享元模式&#xff08;Flyweight Pattern&#xff09;含义 2、享元模式的UML图学习 3、享元模式的应用场景 4、享元模式的优缺点 5、C实现享元模式的简单实例 1、享元模式&#xff08;Flyweight Pattern&#xff09;含义 享元模式&#xff08;Flyweight&#xff09…

企业计算机服务器遭到了locked勒索病毒攻击如何解决,勒索病毒解密

网络技术的不断发展&#xff0c;也为网络安全埋下了隐患&#xff0c;近期&#xff0c;我们收到很多企业的求助&#xff0c;企业的计算机服务器遭到了locked勒索病毒的攻击&#xff0c;导致企业的财务系统内的所有数据被加密无法读取&#xff0c;严重影响了企业的正常运行。最近…