Spring MVC参数校验详解(关于`@RequestBody`返回`400`)

关于Spring MVC参数校验,可以分为两种情况讨论:针对普通请求参数的校验和针对请求体中的JSON格式数据的校验。这里我们主要讲解后者,即针对@RequestBody注解返回400错误时的问题。

1. 报错原因

在开发中,当我们使用@RequestBody注解接收请求体中的JSON格式数据时,经常会遇到传入的参数格式不正确的情况,比如类型不匹配、缺失必要的参数等。

而在这种情况下,Spring MVC会抛出一个MethodArgumentNotValidException异常,但实际上我们期望的应该是HTTP状态码为400的错误信息返回给前端,告知请求参数不合法。

2. 解决方式

为了解决这一问题,我们需要在Controller中添加一个ExceptionHandler来捕获该异常,然后返回自定义的Map格式的错误信息。

具体做法如下:

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
    * 处理实体参数校验不通过异常
    */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Map<String, Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {
        BindingResult bindingResult = ex.getBindingResult();
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        Map<String, Object> errorMap = new HashMap<>(16);
        for (FieldError error : fieldErrors) {
            errorMap.put(error.getField(), error.getDefaultMessage());
        }
        return errorMap;
    }

}

在上述代码中,我们使用了@ExceptionHandler注解来标记该方法为异常处理方法,其中参数为MethodArgumentNotValidException类,其表示实体参数校验不通过时抛出的标准异常。从而实现了对该异常的捕获。

在方法体中,我们首先通过ex.getBindingResult()方法获取到校验结果,进而获取到所有的错误信息。然后,将错误信息存放在一个Map对象中,最后返回即可。

3. 示例

针对上述方法,我们可以通过两个示例来进一步讲解。

首先,在Controller中定义如下方法来演示参数校验:

@PostMapping("/test")
public String test(@RequestBody @Valid User user) {
    return "success";
}

该方法使用@PostMapping注解标记为一个POST类型的请求,使用了@RequestBody注解来接收JSON格式的请求体,同时也使用了@Valid注解来表示需要校验该参数。

User类定义如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @NotBlank(message = "用户名不能为空")
    private String username;
    @NotNull(message = "年龄不能为空")
    @Max(value = 100, message = "年龄不能超过100岁")
    private Integer age;
}

可以看到,在User类中,我们使用了JSR-303提供的注解来对参数进行校验,其中@NotBlank注解表示参数不能为空,@NotNull注解表示参数不能为null,@Max注解表示参数必须小于等于100。

针对以上代码,我们可以进行两次请求进行测试。

  1. 传入参数正确的请求
{
  "username": "张三",
  "age": 22
}

收到的响应如下:

success

响应正常,说明参数校验通过。

  1. 传入参数错误的请求
{
  "username": "",
  "age": "22"
}

此时会收到一个400状态码的信息,其中包含了所有的错误信息,如下所示:

{
  "username": "用户名不能为空",
  "age": "不能为null"
}

从中我们可以看到,该请求存在两个错误:username参数不能为空,而age参数不能为null。由此可以得出,我们成功地实现了对请求体中JSON格式数据的参数校验处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring MVC参数校验详解(关于`@RequestBody`返回`400`) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Maven安装与配置及Idea配置Maven的全过程

    下面是 Maven 安装与配置及 IDEA 配置 Maven 的全过程: Maven 安装与配置 安装 Maven 下载 Maven 安装包:前往 Maven 官网 https://maven.apache.org/,下载最新版本的 Maven 安装包,如: apache-maven-3.8.1-bin.zip 解压至指定目录:将下载后的 zip 压缩包解压…

    Java 2023年5月20日
    00
  • jQuery实现级联下拉框实战(5)

    以下是“jQuery实现级联下拉框实战(5)”的详细攻略: 一、概述 本篇文章是“jQuery实现级联下拉框实战”系列的第五篇,将会探讨如何使用jQuery实现级联下拉框。 在本篇文章中,我们将会实现对于多个级别的下拉框进行级联操作,以此来实现彼此之间的联动。并且,我们将会使用Ajax的方式来获取下一级的选项内容。 二、实现步骤 本文主要分为以下几个步骤来实…

    Java 2023年6月15日
    00
  • Java压力测试的作用是什么?

    Java压力测试是通过模拟多种条件下访问量或请求量的情况来测试系统各项指标并找到系统的瓶颈,从而提高系统的性能。在实际环境中,当访问量或请求量大于系统能够处理的上限时,系统就会出现各种问题,如服务器宕机、响应时间变慢、数据丢失等。 以下是Java压力测试的具体使用攻略: 1. 安装jmeter Jmeter是一款免费的Java压力测试工具,可以通过官方网站下…

    Java 2023年5月11日
    00
  • java字符串相似度算法

    Java字符串相似度算法是一个有趣而且实用的话题。下面给出一份完整的攻略,帮助你快速了解和学习该算法。 什么是Java字符串相似度算法? Java字符串相似度算法是用来计算两个字符串之间相似度的算法。相似度指两个字符串之间的相似程度,可以用来比较两个字符串的相似性。常用的算法有编辑距离算法(Levenshtein Distance)、余弦相似性算法(Cosi…

    Java 2023年5月19日
    00
  • Spring概述和快速构建的方式

    作为Spring框架的作者,我很乐意为您详细讲解Spring的概述和快速构建的方式。 Spring框架概述 Spring框架是Java开发的企业级应用程序框架,提供了诸如IOC(Inversion of Control),AOP(Aspect Oriented Programming),事务管理等功能,旨在使开发者构建Java应用程序变得更加简单。Sprin…

    Java 2023年5月19日
    00
  • java8 LocalDate 使用详解

    Java8 LocalDate 使用详解 什么是LocalDate LocalDate是Java8中用于处理日期的类,它能表示一个ISO-8601标准的日期(如2019-03-29)。相比于Java中旧的日期类(如Date和Calendar)而言,LocalDate有着更好的易用性、更加清晰的语义和更强大的功能。 基本用法 创建LocalDate 使用静态方…

    Java 2023年5月20日
    00
  • Java环境配置与编译运行详解

    Java环境配置与编译运行详解 环境配置 下载JDK安装包 JDK是Java Development Kit的缩写,是Java开发所必须的环境,我们需要从Oracle官网下载对应版本的JDK安装包。 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html 安装JDK 运…

    Java 2023年5月20日
    00
  • Java程序流程控制:判断结构、选择结构、循环结构原理与用法实例分析

    Java程序流程控制是Java编程语言中非常重要的一部分,它可以帮助我们控制程序的执行顺序和流程。程序流程控制主要包括判断结构、选择结构和循环结构。下面我们将详细讲解这三种结构的原理和用法,并且通过实例进行演示。 判断结构 在 Java 中,判断结构主要是通过 if 语句来实现的。if 语句的原理很简单,就是根据条件表达式的结果来决定是否执行特定的代码块。 …

    Java 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部