当前位置: 首页 > news >正文

Spring Boot常用的参数验证技巧和使用方法

简介

Spring Boot是一个使用Java编写的开源框架,用于快速构建基于Spring的应用程序。在实际开发中,经常需要对输入参数进行验证,以确保数据的完整性和准确性。Spring Boot提供了多种方式来进行参数验证,并且可以很方便地集成到应用程序中。

1. 使用JSR-303注解进行参数验证

JSR-303是Java Validation API的规范之一,它定义了一套用于参数验证的注解。Spring Boot支持使用这些注解来验证方法参数、请求参数和实体类字段等。

@RestController
public class UserController {@PostMapping("/user")public ResponseEntity<String> createUser(@Valid @RequestBody UserRequest request) {// 处理请求return ResponseEntity.ok("User created successfully");}
}

在上面的例子中,@Valid注解用于标记需要验证的参数,@RequestBody注解用于指定该参数为请求体。而UserRequest则是一个自定义的实体类,使用了JSR-303注解来验证字段。

public class UserRequest {@NotBlank(message = "用户名不能为空")private String username;@Size(min = 6, max = 12, message = "密码长度必须在6到12个字符之间")private String password;// getter 和 setter 方法省略
}

UserRequest类中,我们使用了@NotBlank注解来验证username字段不能为空,使用了@Size注解来验证password字段的长度在6到12个字符之间。当参数验证失败时,框架会自动抛出MethodArgumentNotValidException异常,并返回相应的错误信息。

2. 使用自定义验证器

除了使用JSR-303注解外,你还可以编写自己的参数验证器。这对于一些特殊的验证需求,或者需要复杂逻辑的验证场景非常有用。

@Component
public class AgeValidator implements ConstraintValidator<ValidAge, Integer> {@Overridepublic boolean isValid(Integer age, ConstraintValidatorContext context) {// 实现自定义的验证逻辑return age >= 18 && age <= 60;}
}

首先,我们需要编写一个实现了ConstraintValidator接口的验证器类。在上面的例子中,我们定义了一个AgeValidator类,用于验证年龄是否在合法范围内(18到60岁)。然后,我们需要在需要验证的地方使用@ValidAge注解来标记需要验证的参数。

@RestController
public class UserController {@PostMapping("/user")public ResponseEntity<String> createUser(@ValidAge @RequestParam("age") Integer age) {// 处理请求return ResponseEntity.ok("User created successfully");}
}

在上述代码中,我们使用了@ValidAge注解来验证age参数的合法性。当参数验证失败时,框架会自动抛出MethodArgumentNotValidException异常,并返回相应的错误信息。

3. 自定义验证错误处理

除了使用框架提供的默认错误处理方式外,你还可以定制化错误处理。可以通过编写全局异常处理器来对参数验证失败时的异常进行捕获和处理。

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<String> handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {BindingResult result = ex.getBindingResult();List<ObjectError> errors = result.getAllErrors();StringBuilder errorMessage = new StringBuilder();for (ObjectError error : errors) {errorMessage.append(error.getDefaultMessage()).append("; ");}return ResponseEntity.badRequest().body(errorMessage.toString());}
}

在上述代码中,我们使用@ControllerAdvice注解将该类声明为全局异常处理器,并使用@ExceptionHandler注解来指定处理MethodArgumentNotValidException异常。当参数验证失败时,会自动进入到这个处理方法中,我们可以从异常对象中获取详细的错误信息并进行处理。

结论

Spring Boot提供了多种灵活且强大的参数验证技巧和使用方法,包括使用JSR-303注解进行参数验证、自定义验证器以及自定义验证错误处理等。通过合理地运用这些技巧,我们可以保证应用程序接收到正确且完整的参数输入,提高系统的稳定性和安全性。

相关文章:

Spring Boot常用的参数验证技巧和使用方法

简介 Spring Boot是一个使用Java编写的开源框架&#xff0c;用于快速构建基于Spring的应用程序。在实际开发中&#xff0c;经常需要对输入参数进行验证&#xff0c;以确保数据的完整性和准确性。Spring Boot提供了多种方式来进行参数验证&#xff0c;并且可以很方便地集成到应…...

手机+卫星的科技狂想

最近硬件圈最火热的话题之一&#xff0c;应该就是突然上线、遥遥领先的华为Mate 60 Pro了。 其中&#xff0c;CPU和类5G网速是怎么实现的&#xff0c;是大家特别关注的问题。相比之下&#xff0c;卫星通话这个功能&#xff0c;讨论度就略低一些&#xff08;没有说不火的意思&am…...

便捷查询中通快递,详细物流信息轻松获取

在如今快节奏的生活中&#xff0c;快递已成为人们生活中不可或缺的一部分。然而&#xff0c;快递查询却常常让人头疼&#xff0c;因为需要分别在不同的快递公司官网上进行查询&#xff0c;耗费时间和精力。为了解决这个问题&#xff0c;固乔科技推出了一款便捷的快递查询助手&a…...

ARM接口编程—Interrupt(exynos 4412平台)

CPU与硬件的交互方式 轮询 CPU执行程序时不断地询问硬件是否需要其服务&#xff0c;若需要则给予其服务&#xff0c;若不需要一段时间后再次询问&#xff0c;周而复始中断 CPU执行程序时若硬件需要其服务&#xff0c;对应的硬件给CPU发送中断信号&#xff0c;CPU接收到中断信号…...

适用于Linux的Windows子系统(PHP搭建lmap、redis、swoole环境)

目录 前言 一、Windows安装Linux子系统 二、Ubuntu搭建PHP开发环境 1.PHP 安装 2.Apache2 安装 3.MySQL安装 4.Redis安装 5.Swoole安装 总结 前言 系列分为三章&#xff08;从安装到项目使用&#xff09;&#xff1a; 一、适用于Linux的Windows子系统&#xff08;系统安装步骤…...

Vue3+Ts+Vite项目(第十二篇)——echarts安装与使用,vue3项目echarts组件封装

概述 技术栈&#xff1a;Vue3 Ts Vite Echarts 简介&#xff1a; 图文详解&#xff0c;教你如何在Vue3项目中引入Echarts&#xff0c;封装Echarts组件&#xff0c;并实现常用Echarts图例 文章目录 概述一、先看效果1.1 静态效果1.2 动态效果 二、话不多数&#xff0c;引入 …...

hive location更新hive元数据表详解

1.hive location更新方式 一、通过修改表DDL&#xff1a; alter table table_name set location hdfs://nm:8020/table_path 二、直接修改hive 的meta info: update DBS set DB_LOCATION_URI replace(DB_LOCATION_URI,"oldpath","newpath")update SDS…...

【SpringBoot】统一功能处理

目录 &#x1f383;1 拦截器 &#x1f380;1.1 拦截器的代码实现 &#x1f3a8;1.2 拦截器的实现原理 &#x1f9f6;2 拦截器应用——登录验证 &#x1f9ba;3 异常统一处理 &#x1f3ad;4 统一数据返回格式 &#x1f9e4;4.1 为什么需要统一数据返回格式 &#x1f9e3;4.2 统…...

分布式数据库-架构真题(二十六)

构件组装成软件系统的过程分为三个不同的层次&#xff08;&#xff09;。&#xff08;2018年&#xff09; 初始化、互连和集成连接、集成和演化定制、集成和扩展集成、扩展和演化 答案&#xff1a;C &#xff08;2018年&#xff09;CORBA服务端构件模型中&#xff0c;&#x…...

MyWebServer开发日记-socket

打算把 tinyWebServer 重写成跨平台&#xff08;Windows and Linux&#xff09;的。 这里首先需要跨平台的 sokcet&#xff0c;主要参考 尹圣雨 的 TCP/IP 网络编程 来着&#xff1a; 代码写的有些笨&#xff0c;欢迎批评&#xff1a; 首先是一个 socket 类&#xff0c;主要…...

图书管理信息系统分析与设计

一、系统开发的可行性分析 &#xff08;一&#xff09;系统背景.必要性及意义 随着社会经济的迅速发展和科学技术的全面进步&#xff0c;计算机事业的飞速发展&#xff0c;以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期。随着经济文化水平的显著提高&#xff0c;人…...

Charles基础使用指南

##Charles 基本使用指南 Charles 在本地构建一个HTTP代理服务器&#xff0c;可以实现对HTTP、HTTPS请求的抓取&#xff0c;也就是我们常说的抓包&#xff0c;以及对请求响应的修改等。 Charles 官网地址 https://www.charlesproxy.com/ ###一、移动端的抓包实现 1. PC端开启…...

Android12之/proc/pid/status参数含义(一百六十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

UMA 2 - Unity Multipurpose Avatar☀️三.给UMA设置默认服饰Recipes

文章目录 🟥 项目基础配置🟧 给UMA配置默认服饰Recipes🟨 设置服饰Recipes属性🟥 项目基础配置 将 UMA_DCS 预制体放到场景中创建空物体,添加DynamicCharacterAvatar 脚本,选择 HumanMaleDCS作为我们的基本模型配置默认Animator 🟧 给UMA配置默认服饰Recipes 服饰Re…...

uniapp-小程序登录授权框

微信官方文档 不弹出授权框原因 因为版本问题&#xff0c;目前的最新的版本是不支持 wx.getUserInfo 去主动弹出授权框 只能引导用户去点击 butten 去授权 解决方法 我的思路是参考了其他的微信微信小程序, 就是跳转到我的页面的时候 在钩子函数内去触发一个封装的模态框,状…...

Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法

Unity 性能优化Shader分析处理函数&#xff1a;ShaderUtil.GetShaderGlobalKeywords用法 点击封面跳转下载页面 简介 Unity 性能优化Shader分析处理函数&#xff1a;ShaderUtil.GetShaderGlobalKeywords用法 在Unity开发中&#xff0c;性能优化是一个非常重要的方面。一个常见…...

第一百四十一回 如何添加程序启动页

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了如何解决BLE包中的错误的内容&#xff0c;本章回中将介绍如何添加程序启动页.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 程序启动页就是点击手机桌面上的程序启动图标后显示的页面&#xff0c;也叫s…...

从零开始的PICO教程(4)--- UI界面绘制与响应事件

从零开始的PICO教程&#xff08;4&#xff09;— UI界面绘制与响应事件 文章目录 从零开始的PICO教程&#xff08;4&#xff09;--- UI界面绘制与响应事件一、前言1、大纲2、教程示例 二、具体步骤1、PICO VR环境配置2、XR的UI Canvas画布创建与调整&#xff08;1&#xff09;C…...

IntelliJ IDEA 远程调试 Tomcat

准备工作 明确远程服务器的 IP 地址&#xff0c;比如我是&#xff1a;192.168.92.128 关掉服务器防火墙&#xff1a;service iptables stop 本地 Remote Server 配置 添加 Remote Server&#xff0c;如下图 复制 Remote Server 自动生成的 JVM 参数&#xff0c;等下有用&…...

谷粒商城----认证服务

一、短信验证码&#xff08;阿里云短信服务&#xff09; Data ConfigurationProperties(prefix "spring.cloud.alicloud.sms") Component public class SmsComponent {private String host;private String path;private String skin;private String sign;private S…...

STM32姿态报警器设计:MPU6050与卡尔曼滤波实战

基于STM32的姿态翻转报警器设计与实现1. 项目概述1.1 系统架构本姿态翻转报警系统采用模块化设计&#xff0c;核心架构由STM32F103RCT6微控制器作为主控单元&#xff0c;通过I2C接口连接MPU6050惯性测量单元(IMU)传感器&#xff0c;实时采集设备的三轴加速度和三轴角速度数据。…...

AutoConnect:ESP32/ESP8266 运行时 Wi-Fi 配网与 OTA 一体化方案

1. AutoConnect 库深度技术解析&#xff1a;面向嵌入式工程师的 ESP32/ESP8266 运行时 Wi-Fi 配置系统AutoConnect 是一个专为 ESP32 和 ESP8266 平台设计的 Arduino 库&#xff0c;其核心目标是在设备运行时&#xff08;runtime&#xff09;通过 Web 界面完成 Wi-Fi 网络的动态…...

OWASP靶场实战指南:从环境搭建到第一个SQL注入漏洞挖掘(含DVWA通关思路)

OWASP靶场实战指南&#xff1a;从环境搭建到第一个SQL注入漏洞挖掘 网络安全的世界就像一片未知的海洋&#xff0c;而靶场就是我们练习游泳的安全泳池。对于刚入门的新手来说&#xff0c;最大的困扰往往不是缺乏理论知识&#xff0c;而是不知道如何将所学付诸实践。OWASP靶场正…...

别再用ls了!从Linux文件系统卡顿,看透MinIO多级目录的性能陷阱与正确用法

从Linux文件系统卡顿到MinIO性能陷阱&#xff1a;高效查询的工程哲学 当你在Linux终端输入ls命令后&#xff0c;系统突然卡死——这种经历对许多开发者来说并不陌生。但很少有人意识到&#xff0c;同样的性能陷阱正潜伏在MinIO这类对象存储系统的日常使用中。本文将揭示文件系…...

高密度PCB贴装实战:如何用模块化治具解决0.3mm间距元件定位难题

高密度PCB贴装实战&#xff1a;模块化治具在0.3mm间距元件定位中的创新应用 当智能手表的PCB板面积缩小到指甲盖大小时&#xff0c;上面的0402元件间距已经突破0.3mm极限——这相当于在1元硬币上精准摆放50根头发丝。消费电子微型化浪潮下&#xff0c;传统治具的定位误差正在吞…...

别再死记硬背了!用Python和SymPy库5分钟可视化理解泰勒公式的逼近过程

用Python动态可视化泰勒公式&#xff1a;5行代码理解多项式逼近本质 数学公式的抽象性常常成为学习者的障碍&#xff0c;尤其是泰勒公式这种涉及无限逼近概念的内容。传统的静态图示和理论推导虽然严谨&#xff0c;却难以直观展示"以直代曲"的动态过程。本文将用Pyth…...

PyFluent:重构CFD仿真流程的技术赋能与效能跃迁

PyFluent&#xff1a;重构CFD仿真流程的技术赋能与效能跃迁 【免费下载链接】pyfluent 项目地址: https://gitcode.com/gh_mirrors/pyf/pyfluent 在现代工程仿真领域&#xff0c;计算流体动力学&#xff08;CFD&#xff09;技术正经历着从手动操作向自动化流程的深刻转…...

嵌入式系统SOC验证与Linux实时补丁技术解析

嵌入式系统软件工程师面试技术要点解析 1. SOC原型验证技术体系 1.1 SOC验证工作内容与方法论 SOC原型验证是芯片设计流程中的关键环节&#xff0c;主要工作内容包括&#xff1a; 功能验证&#xff1a;确保设计符合规范要求 性能验证&#xff1a;评估系统吞吐量、延迟等指标…...

[深度解析] AXI4-Stream Register Slice:时序优化的“外科手术刀”

1. 为什么需要AXI4-Stream Register Slice&#xff1f; 在FPGA设计中&#xff0c;时序问题就像血管中的血栓&#xff0c;随时可能让整个系统瘫痪。想象你正在设计一个4K视频处理流水线&#xff0c;每个像素都要经过十几级处理模块。当系统时钟频率提升到300MHz以上时&#xff0…...

四自由度车辆与简支梁桥车桥耦合振动的Matlab实现

车桥耦合振动程序 matlab编程 四自由度车辆与简支梁桥车桥耦合 可提取车体垂直及转动加速度响应以及车轮响应 在交通工程领域&#xff0c;车桥耦合振动的研究对于保障桥梁结构安全以及行车舒适性至关重要。今天咱们就来讲讲如何用Matlab实现四自由度车辆与简支梁桥的车桥耦合振…...