SpringBoot 如何进行参数校验?

在Spring Boot中进行参数校验通常是使用JSR 303规范(也称为Bean Validation)的注解和Spring的Validation API来完成的。以下是一些常见的步骤和示例,用于在Spring Boot应用程序中进行参数校验:

  1. 添加依赖:
    首先,确保在项目的pom.xml文件中添加以下依赖,以引入Spring Boot和Bean Validation相关的库:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId>
    </dependency>
    <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId>
    </dependency>
    
  2. 创建DTO类(数据传输对象):
    在你的应用中创建一个DTO类,该类用于接收和验证请求参数。在DTO类的字段上使用Bean Validation注解来指定参数校验规则。例如:

    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.Positive;public class UserDTO {@NotBlank(message = "用户名不能为空")private String username;@Positive(message = "年龄必须为正整数")private int age;// Getter和Setter方法
    }
    

在Java中,Bean Validation提供了一组常见的约束注解,用于对数据进行校验。以下是一些常见的约束注解:

  1. @NotNull: 用于标记字段不能为null。
  2. @NotEmpty: 用于标记字段不能为空,可以用于字符串、集合、数组等。
  3. @NotBlank: 用于标记字符串字段不能为空且必须至少包含一个非空格字符。
  4. @Size(min, max): 用于指定字符串、集合或数组的大小必须在指定的范围内。
  5. @Min(value): 用于标记数值字段的最小值。
  6. @Max(value): 用于标记数值字段的最大值。
  7. @DecimalMin(value): 用于标记十进制数值字段的最小值。
  8. @DecimalMax(value): 用于标记十进制数值字段的最大值。
  9. @Digits(integer, fraction): 用于指定数值字段的整数和小数部分的最大位数。
  10. @Pattern(regexp): 用于标记字符串字段必须匹配指定的正则表达式。
  11. @Email: 用于标记字符串字段必须是有效的电子邮件地址格式。
  12. @Future@FutureOrPresent: 用于标记日期字段必须是将来的日期或将来或当前日期。
  13. @Past@PastOrPresent: 用于标记日期字段必须是过去的日期或过去或当前日期。
  14. @AssertTrue@AssertFalse: 用于标记字段必须为true或false。
  15. @Positive@PositiveOrZero: 用于标记数值字段必须为正数或正数或零。
  16. @Negative@NegativeOrZero: 用于标记数值字段必须为负数或负数或零。

这些约束注解可以根据需要单独或组合使用,以对不同类型的数据进行校验。在Spring Boot应用程序中,你可以使用这些注解来定义DTO(数据传输对象)或实体类的字段上,然后通过@Valid注解来触发校验,确保数据的有效性和一致性。

  1. 在控制器中使用DTO:
    在你的控制器中,使用上面创建的DTO类作为请求参数,Spring Boot将自动执行参数校验并将错误信息返回给客户端。例如:

    import org.springframework.web.bind.annotation.*;@RestController
    @RequestMapping("/api/users")
    public class UserController {@PostMapping("/create")public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO userDTO) {// 处理创建用户的逻辑return ResponseEntity.ok("用户创建成功");}
    }
    

    在上面的示例中,@Valid注解用于告诉Spring Boot对UserDTO对象进行参数校验,如果校验失败,将会返回一个包含错误信息的响应。

  2. 自定义错误处理(可选):
    你可以创建一个全局异常处理器来自定义处理参数校验失败的错误。例如:

    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.*;@ControllerAdvice
    public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<String> handleValidationException(MethodArgumentNotValidException ex) {String errorMessage = ex.getBindingResult().getFieldErrors().get(0).getDefaultMessage();return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorMessage);}
    }
    

    在上面的例子中,我们捕获了MethodArgumentNotValidException异常,该异常会在参数校验失败时抛出,然后我们从异常中提取出错误信息并返回一个包含错误消息的BAD_REQUEST响应。

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

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

相关文章

创新家庭办公室:打造完美工作空间的秘诀

一个精心策划的家庭办公室有很多好处&#xff0c;何不把临时工作区升级改造为你的专属工作区呢&#xff0c;还能为这些至关重要的区域注入新的活力。 创造多用途的起居室&#xff1a;我们大多数人都不曾拥有一个可以完全根据工作需求设计的独立家庭办公室——所以有时候要找到…

【锁的区别】C++线程库和POSIX线程库锁的区别

C线程库和POSIX线程库锁的区别 C线程库代码段的互斥&#xff1a;mutex、recursive_mutex、timed_mutex、recursive_timed_mutex互斥量mutex&#xff1a;直接进行lock()或者unlock()递归互斥锁recursive_mutex&#xff1a;可以多次加锁&#xff0c;意味着加几次锁就需要解几次锁…

【C++】:类和对象(2)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

netcore Polly.Core

一、安装包 <PackageReference Include"Polly.Core" Version"8.0.0" /> 二、编写重试 ResiliencePipeline pipeline new ResiliencePipelineBuilder().AddRetry(new RetryStrategyOptions{MaxRetryAttempts 2,Delay TimeSpan.FromSeconds(3),O…

王杰国庆作业day6

服务器 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <my_head.h> #define PORT 2324 //端口号 #define IP "192.168.10.107" //本机IP int main(int argc, const char *argv[]) {sqlite3* d…

【JavaEE】JUC(Java.util.concurrent)常见类

文章目录 前言ReentrantLock原子类线程池信号量CountDownLatch相关面试题 前言 经过前面文章的学习我们大致了解了如何实现多线程编程和解决多线程编程中遇到的线程不安全问题&#xff0c;java.util.concurrent 是我们多线程编程的一个常用包&#xff0c;那么今天我将为大家分…

QT 实现 TCP 客户端服务器代码

服务器 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器头文件 #include<QTcpSocket> //客户端头文件 #include<QList> //链表容器 #include<Q…

Vue2插槽的简单使用示例

插槽-slot 基本使用作用域插槽具名插槽 1. 基本使用 比较简单, 比如: <template> <a :href”url”> <slot :slotData”website”>xxxx</slot> </a> </template> 父页面使用--不用获取slotdemo组件里面的数据的时候: <slotDemo :u…

vue、vuex状态管理、vuex的核心概念state状态

每一个 Vuex 应用的核心就是 store&#xff08;仓库&#xff09;。“store”基本上就是一个容器&#xff0c;它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同&#xff1a; Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候&…

【TensorFlow Hub】:有 100 个预训练模型等你用

要访问TensorFlow Hub&#xff0c;请单击此处 — https://www.tensorflow.org/hub 一、说明 TensorFlow Hub是一个库&#xff0c;用于在TensorFlow中发布&#xff0c;发现和使用可重用模型。它提供了一种使用预训练模型执行各种任务&#xff08;如图像分类、文本分析等&#xf…

导入sklearn报错:No module named ‘threadpoolctl‘

前言 sklearn的安装 注意sklearn安装不是pip install sklearn&#xff0c;而是pip install scikit-learn; 使用清华源安装sklearn&#xff0c;windows中使用自己的python环境&#xff0c;在命令行输入如下&#xff1a; pip install scikit-learn -i https://pypi.tuna.tsing…

COCI2022-2023#1 Neboderi

P9032 [COCI2022-2023#1] Neboderi 题目大意 有一个长度为 n n n的序列 h i h_i hi​&#xff0c;你需要从中选择一个长度大于等于 k k k的子区间 [ l , r ] [l,r] [l,r]&#xff0c;使得 g ( h l h l 1 ⋯ h r ) g\times (h_lh_{l1}\cdotsh_r) g(hl​hl1​⋯hr​)最小&…

A : DS单链表--类实现

Description 用C语言和类实现单链表&#xff0c;含头结点 属性包括&#xff1a;data数据域、next指针域 操作包括&#xff1a;插入、删除、查找 注意&#xff1a;单链表不是数组&#xff0c;所以位置从1开始对应首结点&#xff0c;头结点不放数据 类定义参考 #include<…

计算机专业毕业设计项目推荐11-博客项目(Go+Vue+Mysql)

博客项目&#xff08;GoVueMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式&am…

[黑马程序员TypeScript笔记]------一篇就够了

目录&#xff1a; TypeScript 介绍 TypeScript 是什么&#xff1f;TypeScript 为什么要为 JS 添加类型支持&#xff1f;TypeScript 相比 JS 的优势TypeScript 初体验 安装编译 TS 的工具包 编译并运行 TS 代码 简化运行 TS 的步骤 TypeScript 常用类型 概述类型注解常用基础…

基于微信小程序的付费自习室

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 需求分析3.1用户需求分析3.1.1 学生用户3.1.3 管理员用户 4 数据库设计4.4.1 E…

编写可扩展的软件:架构和设计原则

在今天的软件开发领域&#xff0c;可扩展性是一个至关重要的概念。无论您是开发一个小型应用程序还是一个大规模的软件系统&#xff0c;都需要考虑如何使您的软件能够在不断变化的需求下进行扩展和演进。本文将探讨编写可扩展软件的关键架构和设计原则&#xff0c;以帮助开发人…

Linux友人帐之账号用户管理

一、账号管理 1.1简介 Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪&#…

lv7 嵌入式开发-网络编程开发 12 IP协议与ethernet协议

目录 1 IP协议作用和意义 2 IP数据报首部格式 3 IP数据报分片 4 以太网协议作用和意义&#xff08;链路层&#xff09; 5 练习 1 IP协议作用和意义 IP网的意义 当互联网上的主机进行通信时&#xff0c;就好像在一个网络上通信一样&#xff0c;看不见互连的各具体的网络异…

mysql面试题10:MySQL中有哪几种锁?表级锁、行级锁、页面锁区别和联系?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Mysql中有哪几种锁? 在MySQL中,主要有以下几种类型的锁: 共享锁(Shared Lock):也称为读锁。多个事务可以同时持有共享锁,可以读取但不能修…