Java实战:Spring Boot中各类参数校验机制

引言

在开发Web应用程序时,对客户端传入的参数进行有效校验是保证系统安全性和稳定性的重要环节。Spring Boot作为一个现代化的Java开发框架,提供了多种参数校验的方法和工具,以满足不同场景下的需求。本文将深入探讨Spring Boot中实现各种参数校验的技术手段,包括JSR 303/349 Bean Validation、Spring MVC自带的注解校验以及自定义校验器,并辅以具体示例,帮助我们掌握在实际项目中如何灵活运用这些校验机制。

一、JSR 303/349 Bean Validation

1. 简介

JSR 303(Java Specification Request 303)提出了Java Bean属性校验的标准,后续的JSR 349对其进行了扩展。通过引入javax.validation包中的注解,如@NotNull@Size@Pattern等,开发者可以直接在实体类的属性上声明校验规则。

2. 示例

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;public class UserDto {@NotNull(message = "用户名不能为空")@Size(min = 3, max = 20, message = "用户名长度应在3到20个字符之间")private String username;@NotNull(message = "密码不能为空")@Min(value = 6, message = "密码长度至少为6个字符")private String password;// getter/setter...
}

在Spring Boot中,只需要开启@Valid注解支持,即可自动启用JSR 303/349校验:

@PostMapping("/users")
public ResponseEntity<?> createUser(@Valid @RequestBody UserDto userDto) {// 如果校验失败,Spring MVC会自动抛出MethodArgumentNotValidException异常// 此处省略业务逻辑...
}

二、Spring MVC自带的注解校验

1. 简介

Spring MVC本身也提供了一系列注解用于参数校验,如@RequestParam@PathVariable等可以附加@NotNull等约束条件,实现对HTTP请求参数的校验。

2. 示例

@GetMapping("/users/{id}")
public ResponseEntity<?> getUser(@PathVariable @NotNull(message = "用户ID不能为空") Long id) {// 校验逻辑由Spring MVC处理// 此处省略业务逻辑...
}@PostMapping("/login")
public ResponseEntity<?> login(@RequestParam @Size(min = 3, max = 20, message = "用户名长度应在3到20个字符之间") String username,@RequestParam @NotNull(message = "密码不能为空") String password) {// 校验逻辑由Spring MVC处理// 此处省略业务逻辑...
}

三、自定义校验注解与校验器

1. 简介

对于复杂的业务场景,标准的注解可能无法满足需求,这时就需要自定义校验注解和校验器。

2. 示例

首先,创建自定义注解:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PasswordStrengthValidator.class)
public @interface PasswordStrength {String message() default "密码强度不足";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

接着,编写对应的校验器:

public class PasswordStrengthValidator implements ConstraintValidator<PasswordStrength, String> {@Overridepublic boolean isValid(String password, ConstraintValidatorContext context) {// 自定义校验逻辑,如判断密码是否包含数字、字母、特殊字符等// 这里仅为示例,实际逻辑请根据业务需求编写return password != null && password.length() > 6 && containsNumber(password) && containsLetter(password);}// 辅助方法private boolean containsNumber(String s) {...}private boolean containsLetter(String s) {...}
}

最后,在实体类中使用自定义注解:

public class UserDto {// ...@PasswordStrengthprivate String password;// ...
}

四、全局异常处理与自定义错误响应

为了统一对参数校验失败的异常处理,可以自定义全局异常处理器,实现HandlerExceptionResolver接口,并对MethodArgumentNotValidException等异常进行捕获和处理,返回统一格式的错误响应。

五、Spring Boot WebFlux 中的参数校验

对于使用WebFlux开发的反应式应用,Spring Boot同样支持参数校验,只需在控制器方法参数上使用@Valid注解,结合Reactive的异常处理机制,实现对请求参数的校验。

六、结论

在Spring Boot中实现参数校验,既可以利用JSR 303/349提供的丰富注解,又可以结合Spring MVC自带的注解以及自定义校验注解与校验器,灵活应对不同场景下的校验需求。通过全局异常处理机制,可以实现优雅的错误响应,提升用户体验。在实际开发中,应根据项目特点选择合适的校验策略,确保系统的安全性与稳定性。

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

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

相关文章

typescript 的常用方式

文章目录 前言一、绑定props 默认值的方式&#xff1a;withDefaults1.vue2 的props设置默认值2.vue3 的props设置默认值(1) 不设置默认值的写法(2) 设置默认值的写法&#xff08;分离模式&#xff09;(3) 设置默认值的写法&#xff08;组合模式&#xff09; 二、定义一个二维数…

Matlab在同一张图中如何加入多个图例

根据代码最终画出的图片如下&#xff1a; 其实原理很简单&#xff0c;就是在一张figure中画多个坐标轴&#xff0c;每个坐标轴都有对应的图例&#xff0c;之后再将多余坐标轴隐藏&#xff0c;只保留一个即可。 代码如下&#xff1a; clear all; close all;dd_linewidth 1;a …

maven archetype 项目原型

拓展阅读 maven 包管理平台-01-maven 入门介绍 Maven、Gradle、Ant、Ivy、Bazel 和 SBT 的详细对比表格 maven 包管理平台-02-windows 安装配置 mac 安装配置 maven 包管理平台-03-maven project maven 项目的创建入门 maven 包管理平台-04-maven archetype 项目原型 ma…

Spring学习笔记(六)利用Spring的jdbc实现学生管理系统的用户登录功能

一、案例分析 本案例要求学生在控制台输入用户名密码&#xff0c;如果用户账号密码正确则显示用户所属班级&#xff0c;如果登录失败则显示登录失败。 &#xff08;1&#xff09;为了存储学生信息&#xff0c;需要创建一个数据库。 &#xff08;2&#xff09;为了程序连接数…

洛谷P1927防护伞

题目描述 据说 20122012 的灾难和太阳黑子的爆发有关。于是地球防卫小队决定制造一个特殊防护伞&#xff0c;挡住太阳黑子爆发的区域&#xff0c;减少其对地球的影响。由于太阳相对于地球来说实在是太大了&#xff0c;我们可以把太阳表面看作一个平面&#xff0c;中心定为(0,0…

C 基本语法

我们已经看过 C 程序的基本结构&#xff0c;这将有助于我们理解 C 语言的其他基本的构建块。 C 的令牌&#xff08;Token&#xff09; C 程序由各种令牌组成&#xff0c;令牌可以是关键字、标识符、常量、字符串值&#xff0c;或者是一个符号。例如&#xff0c;下面的 C 语句…

30天自制操作系统(第23天)

23.1 编写malloc 参考第22天的内容&#xff0c;在绘制窗口前先分配了150*50个字节大小的内存&#xff0c;所以导致该文件经编译后有7.6k左右&#xff0c;能否在其中使用指针呢&#xff1f;当需要开辟空间时&#xff0c;移动指针即可。在之前的章节中也有函数memman_alloc函数可…

php源码 单色bmp图片取模工具 按任意方式取模 生成字节数组 自由编辑点阵

http://2.wjsou.com/BMP/index.html 想试试chatGPT4生成&#xff0c;还是要手工改 php 写一个网页界面上可以选择一张bmp图片&#xff0c;界面上就显示这张bmp图片&#xff0c; 点生成取模按钮&#xff0c;在图片下方会显示这张bmp图片的取模数据。 取模规则是按界面设置的&a…

Linux 的交换空间(swap)是什么?有什么用?

目录 swap是什么&#xff1f;swap有什么用&#xff1f;swap使用典型场景如何查看你的系统是否用到交换空间呢&#xff1f;查看系统中swap in/out的情况 swap是什么&#xff1f; swap就是磁盘上的一块区域。它和Windows系统中的交换文件作用类似&#xff0c;但是它是一段连续的…

03、MongoDB -- MongoDB 权限的设计

目录 MongoDB 权限的设计演示前准备&#xff1a;启动 mongodb 服务器 和 客户端 &#xff1a;1、启动单机模式的 mongodb 服务器2、启动 mongodb 的客户端 MongoDB 权限的设计1、MongoDB 的每个数据库都可以保存用户&#xff0c;不止admin数据库可以保存用户。2、保存用户的数据…

Linux 学习笔记(8)

八、 启动引导 1 、 Linux 的启动流程 1) BIOS 自检 2) 启动 GRUB/LILO 3) 运行 Linux kernel 并检测硬件 4) 挂载根文件系统 5) 运行 Linux 系统的第一个进程 init( 其 PID 永远为 1 &#xff0c;是所有其它进程的父进程 ) 6) init 读取系统引导配置文件…

GD25Q32驱动

GD25Q32是一款基于SPI的Flash芯片&#xff0c;容量为32/84M bytes。它的引脚如下&#xff1a; 该芯片支持多种SPI操作方式&#xff0c;包括&#xff1a;Standard SPI(标准SPI)、Dual SPI(双线 SPI)和Quad SPI(四线 SPI) 。有关SPI的介绍可以参考&#xff1a; SPI通信原理-CSDN…

flutter 文字一行显示,超出换行

因为app有多语言&#xff0c;中文和其他语言长度不一致&#xff0c;可能导致英文会很长。 中文样式 英文样式 代码 Row(mainAxisAlignment: MainAxisAlignment.end,crossAxisAlignment: CrossAxisAlignment.end,children: [Visibility(visible: controller.info.fee ! null,ch…

探寻2024年国内热门低代码平台排行!| 功能特点一览

低代码开发是一项革命性的技术&#xff0c;主要目的是尽量避免程序研发的复杂性&#xff0c;让外行开发者也能加入到应用程序的搭建中。低代码平台的核心概念和构成部分通常包括用户界面和拖拽设计、预构件和模块、自动化工作内容与数据库集成和扩展应用&#xff0c;应用低代码…

web前端css基本内容

web前端css 当我们用html的语法给内容规划布局样式时&#xff0c;可能会出现许多个相似的内容需要运用同一种样式&#xff0c;复制粘贴太麻烦而且如果后期要改动的话比如把许多个地方从红色改成蓝色&#xff0c;就需要一个一个改了&#xff0c;这时候就需要引入css来操作了 把…

java-使用jacob删除指定文件夹的邮件

总结见文章最后,具体代码如下: ActiveXComponent outlook = new ActiveXComponent("Outlook.Application");Dispatch myNamespace = Dispatch.call(outlook, "GetNamespace", "MAPI").toDispatch();//指定搜索特定的文件Dispatch allFolders =…

我耀学IT—day05-Bootstrap下拉菜单与导航

一、Bootstrap5 下拉菜单 下拉菜单是可切换的&#xff0c;是以列表格式显示链接的上下文菜单。 例&#xff1a; <div class"dropdown"><button type"button" class"btn btn-primary dropdown-toggle" data-bs-toggle"dropdown&…

U盘弹出提示“该设备正在使用中”:原因与解决方案

在日常使用U盘时&#xff0c;我们可能会遇到一个问题&#xff1a;当尝试安全弹出U盘时&#xff0c;系统提示“该设备正在使用中”。这种情况可能会让用户感到困惑&#xff0c;担心数据是否安全或是否会导致U盘损坏。本文旨在探讨这一现象背后的原因&#xff0c;并提供相应的解决…

【前端素材】推荐优质后台管理系统网页Stisla平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理和控制网站、应用程序或系统的管理界面。它通常被设计用来让网站或应用程序的管理员或运营人员管理内容、用户、数据以及其他相关功能。后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;通常由管理员使…

铅冶炼作业VR虚拟现实互动培训平台降低实操风险

在钢铁工业中&#xff0c;焦炉作业是一个关键的环节&#xff0c;也是一项技术要求高、操作复杂的任务。传统焦炉作业的培训通常需要在实际的焦炉上进行&#xff0c;这不仅对学员的身体素质和心理素质提出了较高的要求&#xff0c;而且也存在一定的安全风险。基于VR虚拟现实制作…