SpringBoot 如何使用 @RequestBody 进行数据校验

SpringBoot 如何使用 @RequestBody 进行数据校验

在 Web 开发中,前台向后台发送数据是非常常见的场景。而在 SpringBoot 框架中,我们通常使用 @RequestBody 注解来接收前台发送的 JSON 数据,并将其转化为 Java 对象。但是,接收到的数据并不一定是符合要求的,因此我们需要对其进行数据校验。本文将介绍如何在 SpringBoot 中使用 @RequestBody 进行数据校验。

在这里插入图片描述

什么是 @RequestBody

@RequestBody 注解用于接收前台发送的 JSON 数据,并将其转化为 Java 对象。它的作用是将 HTTP 请求正文中的 JSON 字符串绑定到相应的 Java 对象上。在 SpringBoot 中,我们通常使用 @RequestBody 注解来接收前台发送的 JSON 数据,并将其转化为 Java 对象。

如何使用 @RequestBody 进行数据校验

在 SpringBoot 中,我们可以使用 JSR-303 规范提供的注解来对 Java 对象进行数据校验。JSR-303 是 Java EE 6 中引入的 Bean Validation 规范,它提供了一套用于数据校验的注解。

在 SpringBoot 中使用 JSR-303 注解进行数据校验的步骤如下:

  1. 引入相关依赖

在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  1. 在 Java Bean 中添加校验注解

在 Java Bean 中添加校验注解,例如:

public class User {
    @NotNull(message = "用户名不能为空")
    private String username;

    @NotNull(message = "密码不能为空")
    @Size(min = 6, message = "密码长度不能小于 6 位")
    private String password;

    // 省略 getter 和 setter 方法
}
  1. 在 Controller 方法中添加 @Validated 和 @RequestBody 注解

在 Controller 方法中添加 @Validated 和 @RequestBody 注解,例如:

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/add")
    public Result addUser(@Validated @RequestBody User user) {
        // 处理添加用户的逻辑
    }
}

在上述代码中,@Validated 注解用于启用数据校验,@RequestBody 注解用于接收前台发送的 JSON 数据,并将其转化为 User 对象。

  1. 处理校验结果

如果数据校验失败,会抛出 MethodArgumentNotValidException 异常。我们可以在 ControllerAdvice 中捕获此异常,并返回校验结果。

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleValidationException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<String> errorMessages = new ArrayList<>();
        for (ObjectError error : allErrors) {
            errorMessages.add(error.getDefaultMessage());
        }
        return Result.error(String.join(",", errorMessages));
    }
}

在上述代码中,我们使用 @RestControllerAdvice 注解声明一个全局异常处理类,其中 @ExceptionHandler 注解用于捕获 MethodArgumentNotValidException 异常,并处理校验结果,最终返回一个 Result 对象。

完整代码示例

@Data
public class User {
    @NotNull(message = "用户名不能为空")
    private String username;

    @NotNull(message = "密码不能为空")
    @Size(min = 6, message = "密码长度不能小于 6 位")
    private String password;
}

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/add")
    public Result addUser(@Validated @RequestBody User user) {
        // 处理添加用户的逻辑
    }
}

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleValidationException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<String> errorMessages = new ArrayList<>();
        for (ObjectError error : allErrors) {
            errorMessages.add(error.getDefaultMessage());
        }
        return Result.error以上示例代码可能有些不完整,我们来完整展示一下如何使用 @RequestBody 进行数据校验的完整代码示例。

### 引入依赖

在 pom.xml 文件中添加以下依赖:

```xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

编写实体类

@Data
public class User {
    @NotNull(message = "用户名不能为空")
    private String username;

    @NotNull(message = "密码不能为空")
    @Size(min = 6, message = "密码长度不能小于 6 位")
    private String password;
}

编写 Controller

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/add")
    public Result addUser(@Validated @RequestBody User user) {
        // 处理添加用户的逻辑
    }
}

在上述代码中,@Validated 注解用于启用数据校验,@RequestBody 注解用于接收前台发送的 JSON 数据,并将其转化为 User 对象。

编写全局异常处理类

如果数据校验失败,会抛出 MethodArgumentNotValidException 异常。我们可以在 ControllerAdvice 中捕获此异常,并返回校验结果。

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleValidationException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<String> errorMessages = new ArrayList<>();
        for (ObjectError error : allErrors) {
            errorMessages.add(error.getDefaultMessage());
        }
        return Result.error(String.join(",", errorMessages));
    }
}

在上述代码中,我们使用 @RestControllerAdvice 注解声明一个全局异常处理类,其中 @ExceptionHandler 注解用于捕获 MethodArgumentNotValidException 异常,并处理校验结果,最终返回一个 Result 对象。

编写启动类

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

编写测试类

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerTest {
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void addUserTest() {
        User user = new User();
        user.setUsername("test");
        user.setPassword("12345");
        ResponseEntity<Result> responseEntity = restTemplate.postForEntity("/user/add", user, Result.class);
        Assert.assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
        Result result = responseEntity.getBody();
        Assert.assertEquals(ResultStatus.FAIL.getCode(), result.getStatus());
        Assert.assertEquals("密码长度不能小于 6 位", result.getMessage());
    }
}

在上述代码中,我们使用 SpringBoot 自带的 TestRestTemplate 对象来模拟发送 POST 请求,并验证数据校验的结果是否符合预期。

总结

在 SpringBoot 中使用 @RequestBody 进行数据校验,可以有效地提高代码的健壮性和可靠性。通过 JSR-303 提供的注解,我们可以轻松地对 Java 对象进行数据校验,并在数据校验失败时返回相应的错误信息。希望本文能够对大家在 SpringBoot 中使用 @RequestBody 进行数据校验有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zookeeper集群的特点

一、Zookeeper集群的特点 Zookeeper:一个领导者 (Leader)&#xff0c;多个跟随者 (Follower) 组成的集群集群中只要有半数以上节点存活&#xff0c;Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器全局数据一致:每个Server保存一份相同的数据副本&#xff0c;C…

git——使用ssh连接远程仓库

文章目录 前言一. 获取邮箱和密码1. 本地配置你的名字和邮箱2. 使用命令获取你本地的邮箱和密码 二、生成ssh公钥1.任意一个文件夹路径打开Git Bash Here并输入以下命令连按三次回车2. 根据上面红框部分的地址打开文件夹3. 打开并查看id_rsa.pub 文件 三、在GitHub上连接ssh1. …

UE5.1.1 C++从0开始(15.作业4个人作业分享)

教程链接&#xff1a;https://www.bilibili.com/video/BV1nU4y1X7iQ 好吧这个作业应该是之前写的&#xff0c;但是我发现我没写&#xff0c;后面我又回去自己写了一遍再看代码&#xff0c;感觉上大差不差&#xff0c;各位可以看着我的和老师的还有自己的对比下。 SBTService_…

[LeetCode周赛复盘] 第 107 场双周赛20230624

[LeetCode周赛复盘] 第 107 场双周赛20230624 一、本周周赛总结6898. 字符串连接删减字母1. 题目描述2. 思路分析3. 代码实现 6895. 构造最长的新字符串1. 题目描述2. 思路分析3. 代码实现 6898. 字符串连接删减字母1. 题目描述2. 思路分析3. 代码实现 6468. 统计没有收到请求…

Consul 理解

Consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案&#xff0c;不再需要依赖其他工具&#xff08;比如ZooKeeper等&#xff09;。服务部署简单&#xff0c;只有一…

(转载)支持向量机(support vector machine, SVM)的分类(matlab实现)

支持向量机(support vector machine,SVM)是一种新的机器学习方法&#xff0c;其基础是Vapnik 创建的统计学习理论(statistical learning theory,STL)。统计学习理论采用结构风险最小化(structural risk minimization,SRM)准则&#xff0c;在最小化样本点误差的同时&#xff0c;…

HTML点击显示、点击隐藏details 标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body><details> <summary>Copyright 1999-2011.</summary> <p> - by Refsnes Da…

Redis数据类型

Redis数据类型 一、String数据类型1、概述2、实验 二、List数据类型1、概述2、实验 三、Hash数据类型&#xff08;散列类型&#xff09;1、概述2、实验 四、Set数据类型&#xff08;无序集合&#xff09;1、概述2、应用范围3、实验 五、Sorted Set数据类型&#xff08;zset、有…

JAVA开发与运维(怎么通过docker部署微服务jar包)

目标&#xff1a; 通过docker的方式部署微服务。 一、背景&#xff1a; 我们通过java开发的微服务可以打成jar包&#xff0c;我们可以直接通过裸机部署&#xff0c;也可以通过docker来部署&#xff0c;本文介绍通过docker来部署微服务。 二、首先我们介绍一下docker的发展过程…

2022 年第十二届 MathorCup 高校数学建模挑战赛D题思路(移动通信网络站址规划和区域聚类问题)

目录 一、前言 二、问题背景 三、问题 四、解题思路 &#xff08;1&#xff09;针对问题1&#xff1a; &#xff08;2&#xff09;针对问题2&#xff1a; &#xff08;3&#xff09;针对问题3&#xff1a; 五、附上几个典型代码 &#xff08;1&#xff09;K-means算法…

【HTTP 协议】掌握 Web 的核心技术

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 谈起 HTTP 协议&#xff08;超文本传输协议&#xff09;&#xff0c;不知道大家第一次是从什么地方了解到这个协议的呢&#xff1f;在真实的网络环境中网络协议的种类非常多&#xff0c;其中有一些耳熟能详的…

深入解析大型语言模型:从训练到部署大模型

简介 随着数据科学领域的深入发展&#xff0c;大型语言模型—这种能够处理和生成复杂自然语言的精密人工智能系统—逐渐引发了更大的关注。 LLMs是自然语言处理&#xff08;NLP&#xff09;中最令人瞩目的突破之一。这些模型有潜力彻底改变从客服到科学研究等各种行业&#x…

SpringSecurity实现Remember-Me实践

【1】基于会话技术的实现 也就是基于Cookie的实现&#xff0c;用户信息通过某种规则进行加密然后生成一个字符串设置为cookie。 ① 登录页面 这里name"remember-me"表示“记住我”的复选框&#xff0c;默认key是remember-me。 <form action"/user/login&…

EasyCVR电子地图鼠标悬停展示经纬度的技术实现

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可…

VS2019 Python连接Sql server2008

安好后&#xff1a; 测试代码&#xff1a; import pymssqltry:conn pymssql.connect(host127.0.0.1,usersa,password123456,databasehotel,charsetutf8)# 连接并执行Sql语句cursor conn.cursor()sql select * from odercursor.execute(sql)# 获取数据集rs cursor.fetchal…

从操作系统角度了解内存管理

一.内存管理 1.主要功能 内存管理的主要功能有: 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理&#xff0c;使程序员摆脱存储分配的麻烦&#xff0c;提高编程效率。地址转换。在多道程序环境下&#xff0c;程序中的逻辑地址与内存中的物理地址不可能一致, …

React--Component组件浅析

目录 一 前言二 什么是React组件&#xff1f;三 二种不同 React 组件1 class类组件2 函数组件 四 组件通信方式五 组件的强化方式六 总结 一 前言 在 React 世界里&#xff0c;一切皆组件&#xff0c;我们写的 React 项目全部起源于组件。组件可以分为两类&#xff0c;一类是类…

Redis---集群

目录 一、集群的介绍 1.1 为什么需要集群呢&#xff1f; 1.2 什么是集群&#xff1f; 1.2 集群能干什么呢&#xff1f; 二、集群的算法之分片&槽位slot 2.1 什么是槽位slot&#xff1f; 2.2 分片 2.3 使用槽位和分片的优势 2.4 slot 槽位映射的三种算法 1、哈…

《深入浅出WPF》学习笔记

文章目录 相关资源前言WPF 学习笔记环境配置WPF基础&#xff1a;一个WPF程序是如何启动的xmal文件和cs文件是如何连接的如何确定启动页面xmal文件如何引用别的文件如何引用 WPF是如何创建元素&#xff0c;改变元素的WPF的元素创建和简单属性赋值WPF的树形界面Xmal属性赋值为什么…

内网安全:代理技术详解

目录 代理技术实验所用网络拓扑图及说明 代理技术 SOCK协议 使用代理技术的原因 正向代理与反向代理 实战一&#xff1a;MSF代理通讯 实验原理说明 一. Meterpreter建立路由 二. MSF建立节点 三. 建立代理到MSF上 实战二&#xff1a;CS代理通讯 实验原理说明 一. …