springboot使用validation-api对入参进行校验

news2024/11/18 21:38:51

springboot使用validation-api对入参进行校验

前言:在实际开发中,我们不能完全相信前端给我们的参数是否符合预期或规范,为了避免恶意入参,引发系统或数据安全问题,需要对前端传过来的参数进行校验。例如字符串长度校验,空值校验,手机号校验,邮箱校验,字符串复杂性校验等等。

springboot提供了validation-api,对入参校验做了封装,方便使用。

1. 引入依赖

		<!-- 入参校验 validation-api -->
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
		</dependency>

2. 创建入参实体类dto

使用validation-api校验注解标注入参dto

@Data
@ToString
public class UserInfoDto {
    @NotNull(message = "userId不能为空")    // 非空
    private String userId;
    @NotBlank(message = "账号不能为空")    // 非空字符串
    private String account;
    @Email(message = "邮箱格式不正确")      // 邮箱格式
    private String email;
    @Length(min = 2, max = 20, message = "昵称长度不能低于2个字符且不能高于20个字符")      // 字符串长度最小2,最大20
    @NotNull(message = "昵称不能为空")
    private String nickname;
    @Range(min = 0, max = 130, message = "年龄区间为0-130岁")      // 数值最小0,最大130
    private Integer age;
    @Past(message = "生日不能是未来时间")      // 日期必须是过去的日期
    private Date birthday;
}

注意点

非常重要的一点是:**以上注解是独立的,@Email不会去验证Email是否为空,就是说即便添加了@Email、@Lenght、@Range等等注解,它只是在前端传来的参数中,带有被该注解修饰的参数才去做校验。**例如前端给的json为{"userId":"123","account":"456","nickname":"zhangsan"},那么也是可以通过以上校验的,不会报校验不通过。

3. 接口类

在controller接收参数时还需要标注@Validated注解

@RestController
@RequestMapping("userinfo")
@Validated
public class UserInfoController {

    @PostMapping("add1")
    public String addUserInfo1(@Validated @RequestBody UserInfoDto userInfoDto){
        System.out.println(userInfoDto);
        return "添加成功";
    }

    @PostMapping("add2")
    public String addUserInfo2(@Validated UserInfoDto userInfoDto){
        System.out.println(userInfoDto);
        return "添加成功";
    }

    @PostMapping("add3")
    public String addUserInfo2(@Email String email){
        System.out.println(email);
        return "添加成功";
    }
}

注意点:类上的@Validated注解是配合RequestParam上的@Email(也包含其他如@NotNull,@Length等注解)使用的,如果仅对RequestBody参数做验证,则直接在RequestBody前加@Validated即可(配合以上接口代码理解)

4. 异常处理类

以上代码对入参做了校验,结果是参数不符合直接报错,将异常返回给前端,例如

image-20231215195617550.png

在实际开发肯定是不合适的,我们需要对异常进行捕获,返回前端能识别的异常信息。就需要用到Springboot提供的全局异常捕获处理机制。创建异常处理类:

@ControllerAdvice
public class ValidateHandler {

    /**
     * 异常处理方法,符合ExceptionHandler.value的异常,会执行其处理方法,
     * 处理的是RequestBody校验的异常
     * @param e 捕获的异常
     * @return 返回前端的数据
     */
    @ExceptionHandler(value = org.springframework.validation.BindException.class)
    @ResponseBody
    public String handleBindException(Exception e) {
        org.springframework.validation.BindException ex = (org.springframework.validation.BindException) e;
        String collect = ex.getAllErrors().stream()
                .map(ObjectError::getDefaultMessage)
                .collect(Collectors.joining("; "));
        // 实际开发中一般返回带状态码的Result对象,这里仅做简单演示,自行修改
        return collect;
    }

    /**
     * 处理的是RequestParam校验的异常
     */
    @ExceptionHandler(value = javax.validation.ConstraintViolationException.class)
    @ResponseBody
    public String handleConstraintViolationException(Exception e) {
        javax.validation.ConstraintViolationException ex = (javax.validation.ConstraintViolationException) e;
        String collect = ex.getConstraintViolations().stream()
                .map(ConstraintViolation::getMessage)
                .collect(Collectors.joining("; "));
        return collect;
    }

}

5.最后返回结果

image-20231215200449755.png

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

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

相关文章

牛客网BC107矩阵转置

答案&#xff1a; #include <stdio.h> int main() {int n0, m0,i0,j0,a0,b0;int arr1[10][10]{0},arr2[10][10]{0}; //第一个数组用来储存原矩阵&#xff0c;第二个数组用来储存转置矩阵scanf("%d%d",&n,&m); if((n>1&&n<10)&&am…

ShopsN commentUpload 文件上传漏洞复现

0x01 产品简介 ShopsN 是一款符合企业级商用标准全功能的真正允许免费商业用途的开源网店全网系统。 0x02 漏洞概述 ShopsN commentUpload 接口处存在任意文件上传漏洞,攻击者可以利用文件上传漏洞执行恶意代码、写入后门、读取敏感文件,从而可能导致服务器受到攻击并被控…

千梦网创:Too Young,to simple

大多数人啊&#xff0c;还是too young&#xff0c;包括我。 网上的评论对我而言并不影响我通过提供价值服务经营生活&#xff0c;但是有时候对于我的思考还是有一些帮助的。 我把很多可以争与不可争的事件看做是一种现象&#xff0c;这种现象往往可以给予我新的能量。 当学员…

2024美赛备战-美赛必备技能(matlab 和SPSS入门必备)

( 一 )Matlab 1.数值计算和符号计算功能 Matlab 以矩阵作为数据操作的基本单位&#xff0c;它的指令表达式与数学、工程中 常用的符号、表达式十分相似&#xff0c;故用Matlab 来解算问题要比用C、FORTRAN 等 语 言完成相同的事情简捷得多&#xff0c;使学者易于学习和掌握…

完蛋,我的AI自己动起来了

故事的开始 一开始&#xff0c;我只是给我的公众号接入了星火认知大模型。但是公众号的应用场景不足&#xff0c;没办法当成群机器人来用。所以我后来办了张新的电话卡&#xff0c;注册了个小号微信。想把小号打造成微信群聊助手&#xff0c;在我没时间翻冗长的聊天记录的时候…

平面腔体谐振计算与仿真

PCB的电源网络是由电介质材料隔开的两个平行金属板所组成&#xff0c;可以通过以下的3种方法对其谐振模式进行分析&#xff1a; 1. 基于腔体模型的计算&#xff1b; 2. 基于SPICE等效电路&#xff1b; 3. 基于全波数值电磁算法的3D模型。 设计得当的前提下&#xff0c;上述3种方…

西工大计院计算机系统基础实验二(配置gdb插件)

第二次实验是二进制炸弹实验&#xff0c;为了简化操作&#xff0c;并且让大家接下来能够按照作者之前已经为网安院写好的博客西工大网络空间安全学院计算机系统基础实验二&#xff08;清楚实验框架及phase_1&#xff09;-CSDN博客来走&#xff0c;大家需要下载一款好用的gdb插件…

退回论文如何修改最好最快 快码论文

大家好&#xff0c;今天来聊聊退回论文如何修改最好最快&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 退回论文如何修改最好最快 当论文被退回时&#xff0c;如何修改才…

“快速排序:一种美丽的算法混沌”

欢迎来到我的博客&#xff01;在今天的文章中&#xff0c;我将采用一种独特且直观的方式来探讨我们的主题&#xff1a;我会使用一幅图像来贯穿整篇文章的讲解。这幅精心设计的图表不仅是我们讨论的核心&#xff0c;也是一个视觉辅助工具&#xff0c;帮助你更深入地理解和掌握本…

【idea】idea尾部自动删除空格,idea2023.1.2关闭自动去除行尾空格的功能

这个功能是由于git或者svn上的代码有许多空格的时候&#xff0c;会自动把空格去掉&#xff0c;就会导致出现许多更改的地方&#xff0c;会自动删空格。 尾部刚打好空格准备写代码&#xff0c;自动就删掉空格&#xff0c;又得重打空格后继续编码&#xff0c;非常不爽。 设置如…

linux sed批量修改替换文件中的内容/sed特殊字符

sed系列文章 linux常用命令(9)&#xff1a;sed命令(编辑/替换/删除文本)linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行linux sed批量修改替换文件中的内容/sed特殊字符 文章目录 sed系列文章一、sed替换文本语法1.1、基础语法1.2、高阶语法 二、实战/实例2.1…

群晖7.2使用Docker安装容器魔方结合内网穿透实现远程访问

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. 拉取容器魔方镜像2. 运行容器魔方3. 本地访问容器魔…

SpringTask

SpringTask是一种用于定时任务调度的框架周期性任务、定时任务需要SpringTask框架 比较出名的框架有三种&#xff1a; &#xff08;1&#xff09;SpringTask(没有很大的并发量需求量&#xff0c;用SpringTask足够) &#xff08;2&#xff09;Quartz(老牌的定时任务&#xff0c…

在IDEA 2023.3中Jrebel debug 模式无法启动

目录 版本说明问题描述解决方式 版本说明 IDEA&#xff1a;IntelliJ IDEA 2023.3 (Ultimate Edition) Jrebel&#xff1a; JRebel Agent 2023.4.2 (202312041035) 问题描述 在IDEA中启动debug模式时无法正常启动 解决方式 在 IDEA 2023.3 版本修改了默认的配置&#xff…

仿淘宝、京东首页icons横向滑动效果

一、效果展示 淘宝&#xff1a; 京东&#xff1a; 二、话不多说&#xff0c;直接上demo 案例效果 代码 <template><div class"demo-page"><h1>滚动效果</h1><div classicons-slide-wrapper><div class"icons-container&quo…

k8s节点not ready

开发小伙伴反应&#xff0c;发布应用失败。检查后发现有个虚拟机挂掉了 启动后先重启服务&#xff1a;&#xff08;一般是自启动&#xff0c;自动拉起pod服务&#xff09; service docker restart docker ps |grep kube-apiserver|grep -v pause|awk ‘{print $1}’|xargs -i …

【SpringBoot】配置文件

配置文件官网 1. 配置方式 application.propertiesapplication.yml / application.yaml 2. 自定义配置信息 将实体类中的本应该写死的信息写在属性配置文件中。 可以使用 Value("${键名}") 获取&#xff0c;也可以使用 ConfigurationProperties(prefix"前…

C++_类的定义和使用

目录 1、类的引用 1.1 类的成员函数 1.2 类成员函数的声明和定义 2、类的定义 2.1 类的访问限定&#xff08;封装&#xff09; 3、类重名问题 4、类的实例化 4.1 类的大小 5、隐含的this指针 5.1 空指针问题 结语&#xff1a; 前言&#xff1a; C的类跟c语言中的结…

【Vue】日期格式化(全局)

系列文章 【Vue】vue增加导航标签 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue&#xff0c;在Windows IIS平台…

Tomcat的结构分析和请求处理原理解析

目录 Tomcat服务器&#xff1f;Tomcat结构处理请求流程Tomcat作用其他的web服务器 Tomcat服务器&#xff1f; 我们经常开口闭口“服务器”、“服务器”的&#xff0c;其实“服务器”是个很容易引发歧义的概念 其实&#xff0c;Tomcat服务器 Web服务器 Servlet/JSP容器&#…