SpringBoot之参数校验

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
SpringBoot之参数校验


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 一、参数校验的重要性
  • 二、简单数据类型参数校验
  • 三、对象类型参数校验
  • 四、异常处理
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

在 SpringBoot 的世界里,参数校验是确保数据完整性和正确性的重要一环。它就像是一道坚固的防线,守护着我们的应用程序,防止恶意或错误的数据闯入。
想象一下,如果没有参数校验,我们的应用将会面临各种数据不一致、空指针异常等问题,就像是一场噩梦。但是,有了 SpringBoot 的参数校验功能,我们可以轻松地对传入的参数进行检查,确保它们符合我们的预期。
这就像是给我们的应用程序加上了一层保护罩,让我们可以放心地处理数据,而不用担心数据的质量问题。所以,让我们一起深入了解 SpringBoot 的参数校验吧,掌握它的奥秘,让我们的应用程序更加健壮和可靠!


提示:以下是本篇文章正文内容,下面案例可供参考

一、参数校验的重要性

在应用程序的各个层面,我们都需要对传入的参数进行校验,以确保它们符合预期的格式、范围和约束。参数校验可以帮助我们避免以下问题:

  • 数据不合法:通过对参数进行校验,可以确保数据符合业务规则和数据模型的要求。
  • 异常处理:在参数校验过程中,可以提前捕获和处理非法参数,避免在后续的业务逻辑中引发异常。
  • 安全性:通过参数校验,可以防止 SQL 注入、跨站脚本攻击等安全漏洞。

二、简单数据类型参数校验

SpringBoot自带了validation工具可以从后端对前端传来的参数进行校验,用法如下:

  1. 引入validation起步依赖
<!-- 参数校验 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  1. 在需要进行参数校验的实体类上添加@Validated注解,表示该类将进行参数校验。在参数前加校验注解,表示对这个参数进行具体的参数校验。
// 该控制器开启参数校验
@Validated
@Controller
public class TestController {@RequestMapping("/t1")@ResponseBody// 在参数前加校验注解,该注解的意思是字符串参数不能为nullpublic String t1(@NotBlank String username){System.out.println(username);return "请求成功!";}
}
  1. 访问http://localhost:8080/t1,发现当没有传来参数时,会抛出ConstraintViolationException异常。
  2. 在校验参数的注解中添加message属性,可以替换异常信息。
// 该控制器开启参数校验
@Validated
@Controller
public class TestController {@RequestMapping("/t1")@ResponseBody// 在参数前加校验注解,该注解的意思是字符串参数不能为nullpublic String t1(@NotBlank(message = "用户名不能为空") String username){System.out.println(username);return "请求成功!";}
}

除了@NotBlank,还有很多其他的注解

注解作用
注解 描述
@DecimalMax数值的最大值,可以包含小数。
@DecimalMin数值的最小值,可以包含小数。
@Digits设置必须是数字且数字整数的位数和小数的位数必须在指定范围内
@Future日期是否为将来的日期。
@Past日期是否为过去的日期。
@Max数值的最大值。
@Min数值的最小值。
@NotNull不能为null,可以是空
@Null必须为null
@NotBlank字符串的值不能为空白,即不能只包含空格。
@NotEmpty字符串、集合或数组的值不能为空,即长度大于0
@Pattern字符串是否匹配指定的正则表达式。
@Size字符串、集合或数组的大小是否在指定范围内。
@Email字符串是否为有效的电子邮件地址。
@Length长度必须在指定范围内
@Range值必须在指定范围内
@URL必须是一个URL
@AssertTrue布尔值是否为true。
@AssertFalse布尔值是否为false。

三、对象类型参数校验

SpringBoot也可以校验对象参数中的每个属性,用法如下:

  1. 添加实体类
public class Student {@NotNull(message = "id不能为空")private Integer id;@NotBlank(message = "姓名不能为空")private String name;// 省略getter/setter/tostring
}
  1. 编写控制器
@Controller
public class TestController2 {@RequestMapping("/t3")@ResponseBody// 校验的对象参数前添加@Validated,并将异常信息封装到BindingResult对象中public String t3(@Validated Student student,BindingResult result) {// 判断是否有参数异常if (result.hasErrors()) {// 所有参数异常List<ObjectError> list = result.getAllErrors();// 遍历参数异常,输出异常信息for (ObjectError err : list) {FieldError fieldError = (FieldError) err;System.out.println(fieldError.getDefaultMessage());}return "参数异常";}System.out.println(student);return "请求成功!";}
}

四、异常处理

ConstraintViolationException是 Java 的 Bean Validation API 抛出的异常,用于表示在验证数据对象时违反了约束条件。当你在 Java 中使用 Bean Validation 注解(如@NotNull、@Size等)来定义数据对象的约束条件,并尝试保存或更新一个违反这些约束条件的数据对象时,ConstraintViolationException就会被抛出。ConstraintViolationException包含了关于违反约束条件的详细信息,包括约束注解的名称、违反的属性路径以及相应的错误消息。这些信息可以帮助你定位和修复数据对象中的问题。

当抛出ConstraintViolationException异常后,我们可以使用SpringMVC的异常处理器,也可以使用SpringBoot自带的异常处理机制。当程序出现了异常,SpringBoot会使用自带的BasicErrorController对象处理异常。该处理器会默认跳转到/resources/templates/error.html页面。
编写异常页面:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>错误页面</title>
</head>
<body>
<h1>服务器开小差了!</h1>
</body>
</html>

总结

提示:这里对文章进行总结:

Spring Boot 参数校验是构建可靠和安全应用的重要组成部分。通过使用注解和验证器,我们可以轻松地对请求参数进行校验,并在异常情况下提供友好的错误消息。在实践中,遵循最佳实践,结合业务需求进行细粒度的参数校验,可以提高应用的可靠性和用户体验。

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

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

相关文章

uniapp实现文字超出宽度自动滚动(在宽度范围之内不滚动、是否自动滚动、点击滚动暂停)

效果如下: 文字滚动 组件代码: <template><view class="tip" id="tip" @tap.stop="clickMove"><view class=

CMU15-445-Spring-2023-Project #0 - C++ Primer

前置任务。 Task #1 - Copy-On-Write Trie Copy-on-write (COW) Trie 在进行修改时&#xff0c;不会立即复制整个数据结构。相反&#xff0c;它会在需要修改的节点被多个引用的时候才进行复制。当要对某个节点进行写操作&#xff08;添加子节点或者继续向下insert&#xff09…

修改多选框el-checkbox样式, 大小,背景色

修改多选框el-checkbox样式, 大小,背景色 /* 背景透明 */ .el-checkbox__inner {background: transparent;border: 1px solid #00ffe5; } /* 选中样式 */ .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {b…

灸哥问答:分布式系统中数据一致性的问题如何解决

在分布式系统&#xff0c;数据一致性的问题是一个老生常谈&#xff0c;必须面对的一个问题&#xff0c;而且又极具挑战和复杂度的一个问题&#xff0c;针对数据一致性的问题&#xff0c;没有一个简单的单一的解决方案可以圆满解决&#xff0c;是需要结合具体的场景&#xff0c;…

人工智能技术在教育行业有哪些应用?

人工智能技术在教育行业有以下几个主要应用&#xff1a; 1. 个性化学习&#xff1a;人工智能可以根据学生的学习情况和特点&#xff0c;提供个性化的学习内容和教学方法。通过分析学生的学习数据和行为模式&#xff0c;AI 可以给予针对性的建议和反馈&#xff0c;帮助学生更好地…

环境准备-VMware安装

照顾到很多人不是很会环境搭建&#xff0c;我这里会将搭建的步骤讲的细致点 第一步&#xff0c;VMware下载。目的是通过VMware搭建Linux服务器&#xff0c;因为大家大部分还是Windows的电脑&#xff0c;我们先下载虚拟机搭建一个Linux系统的服务器 下载完成之后&#xff0c;点…

Java Synchronized 和 ReentrantLock

目录 介绍 synchronized synchronized 修饰实例方法 修饰静态类方法 synchronized 修饰代码块 实现细节 ReentrantLock ReentrantLock 基本使用 公平锁实现 读写锁&#xff08;ReentrantReadWriteLock&#xff09; 1. 创建读写锁对象&#xff1a; 2. 通过读写锁对象…

Open3D 点云分割之区域生长(Python版本,指定种子点)

文章目录 一、简介一、简介二、实现代码三、实现效果参考资料一、简介 一、简介 点云分割作为许多应用的前提,其直接会关乎到后续利用点云数据进行曲面重建、特征提取等处理的效果。区域生长算法做为一种较为经典的聚类分割算法,具有很广泛的应用,算法过程如下所述: 1、首…

38 调优kafka

操作系统调优 1.禁止atime更新&#xff0c;减少文件系统的写操作。 mount -o noatime 2.选择高性能的文件系统&#xff0c;如ext4或者XFS 3.swap空间设置&#xff0c;将swappniness设置成很小的一个值比如1&#xff5e;10&#xff0c;防止linux OOM Killer 开启随意杀掉进程。…

LeetCode 2807. 在链表中插入最大公约数

给你一个链表的头 head &#xff0c;每个结点包含一个整数值。 在相邻结点之间&#xff0c;请你插入一个新的结点&#xff0c;结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。 两个数的 最大公约数 是可以被两个数字整除的最大正整数。 示例 1&#xf…

Vue前端文字效果:如何让一段文本像是手动一个一个字打出来的

效果展示 自己做的AI聊天机器人界面&#xff0c;我觉得比微信还好看 由于这个前端略微复杂&#xff0c;下文用最简单的例子来展示&#xff1a; 分析需求 对于AI聊天工具的前端&#xff0c;如果AI生成的文本像是一个一个字打出来的&#xff0c;就会让AI看起来更像真的人&…

Python: 你所不知道的星号 * 用法

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/FHyosiG_tegF5NRUEs7UdA 本文大概 1152 个字&#xff0c;阅读需花 6 分钟 内容不多&#xff0c;但也花了一些精力 如有余力&#xff0c;欢迎点赞…

MySQL主从复制案例实现

使用Sharding-JDBC实现读写分离&#xff1a; 1、导入maven坐标 2、 在配置文件中配置读写分离规则 3、在配置文件中配置允许bean定义覆盖配置项 1、导入maven坐标 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jd…

SoapUI 怎么下载:实用指南

SoapUI Windows 版本下载 今天带大家过一遍 SoapUI 在 Windows 系统下的安装教程吧&#xff01;各位 开发小伙伴 们可以跟着我一起来~ 下载安装包 下载链接&#xff1a;www.soapui.org/downloads/s… 安装 安装非常简单&#xff0c;只需双击它即可启动&#xff0c;安装程序…

【node】Error message “error:0308010C:digital envelope routines::unsupported“

Error: error:0308010C:digital envelope routines::unsupported 版本 【nvm】node版本升降版本 错误 LuckyLucky MINGW64 /e/_DockerDesktop/strong/strong-data (master) $ npm run serve> smallwei/strong-data2.0.1 serve > vue-cli-service serveBrowserslist: …

AWS(三):如何在AwsManagedAd目录和windowsAD实例之间建立双向信任。

前提&#xff1a; 1.创建好了一个AWS managed AD目录&#xff0c;我的目录域名为:aws.managed.com 2.创建好了一个windows AD实例并提升了为域控服务器,实例域名为:aws2.com 看过我AWS 一和二的应该都会创建windows实例了&#xff0c;切记不能将其无缝加入到aws managed AD的…

gitlab 仓库创建及使用

git的工作环境 工作区 暂存区 git add * 版本库 git commit -m “版本描述信息” HEAD 版本号 版本日志git clone gitIP地址:/自建的目录/自建的库/ #克隆到本地 git add . #存储到暂存区 git commit -m "描述信息" #更新版本 git push origin master …

Springboot通过profiles切换不同环境使用的配置

文章目录 简介1.通过分隔符隔离2.通过使用不同的配置文件区分3.测试 简介 一个项目从开发到上线一般要经过几个环境, dev测试环境-uat预生产环境-prod生产环境&#xff0c;每个环境的使用的数据库或者配置不同&#xff0c;这时候可以通过下面两种方式区分配置,达到快速切换的效…

Linux引导和服务

目录 一、Linux引导 1、Linux开机启动的完整过程&#xff1a; 2、bios的作用&#xff1a; 3、boot&#xff1a; 例题&#xff1a;可以将内核文件放在何处&#xff1f; 4、mbr&#xff1a; 5、grub&#xff1a; 6、加载内核文件&#xff1a;就是把内核运行在内存中 7、启…

密码学:带密钥的消息摘要算法一数字签名算法

文章目录 前言手写签名和数字签名前置知识点&#xff1a;消息摘要算法数字签名算法数字签名算法的由来数字签名算法在实际运用的过程附加&#xff1a;签名和摘要值的解释 数字签名算法的家谱数字签名算法的消息传递模型经典数字签名算法-RSA实现 数字签名标准算法-DSA实现 圆曲…