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

yizhihongxing

关于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日

相关文章

  • Spring Security的过滤器链机制

    Spring Security是一个流行的企业级安全框架,它可以提供应用程序的验证和授权服务。在Spring Security中,过滤器链(Filter Chain)是其中一个重要的概念。 Spring Security的过滤器链 Spring Security的过滤器链是一个由多个过滤器组成的链式结构,用于对每一个请求进行处理。当一个请求进入Spring …

    Java 2023年6月3日
    00
  • Java实现json数据处理的常用脚本分享

    下面是Java实现json数据处理的常用脚本分享的完整攻略: 一、前置知识 在学习Java实现json数据处理之前,我们需要先了解什么是JSON和Java中处理JSON数据的类库,如:Gson, Jackson等。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。JSON主要由两种结构组成:键…

    Java 2023年5月26日
    00
  • IDEA2022.2的简介、下载与安装、配置教程

    IDEA2022.2简介 IntelliJ IDEA是一款由JetBrains开发的Java集成开发环境(IDE),它具有丰富的功能,能够支持多种编程语言,包括Java、Kotlin、Groovy、Scala等。最新版本是IntelliJ IDEA 2022.2,该版本的更新包括改进的性能、新的工具和特性,以及对多种语言的良好支持。 IDEA2022.2下载…

    Java 2023年5月26日
    00
  • java控制台输出百分比进度条示例

    下面我来详细讲解一下如何实现“java控制台输出百分比进度条示例”。 1. 实现思路 要实现进度条功能,我们可以通过在控制台输出一系列“=”符号来表示进度条的长度,然后再在其后输出当前进度百分比的方式来实现。具体实现步骤如下: 先确定进度条长度,即宽度为多少个字符,可以自己根据要求来设置。比如我们设置宽度为50,那么进度条长度就是50个字符。 每次更新进度时…

    Java 2023年5月26日
    00
  • C语言与java语言中关于二维数组的区别

    C语言和Java语言在二维数组的定义和使用方面存在一些区别,下面我将分别对它们的二维数组进行详细讲解。 C语言中的二维数组 定义 在C语言中,二维数组可以被定义为由多个一维数组组成的数组,每个一维数组又由多个元素组成。二维数组的定义和初始化可以通过以下方式进行: // 定义一个3行4列的二维数组 int a[3][4] = { {1, 2, 3, 4}, {…

    Java 2023年5月26日
    00
  • Win2003中apache2整合tomcat5和IIS6的方法

    Win2003中apache2整合tomcat5和IIS6的方法,一般有以下两种方案: 方案一:通过Jk模块整合 下载“mod_jk.so”文件并保存到“modules”目录下; 修改“httpd.conf”文件,在最后添加以下代码: LoadModule jk_module modules/mod_jk.so JkWorkersFile D:/Apache…

    Java 2023年5月19日
    00
  • Java8生成时间方式及格式化时间的方法实例

    Java8生成时间方式及格式化时间的方法实例 本文将介绍Java8生成时间的几种方式,以及如何利用DateTimeFormatter对时间进行格式化。 生成时间的方式 Java8提供了3种生成时间的方式:1. 使用now()静态方法生成当前时间2. 使用of()静态方法生成指定时间3. 使用parse()静态方法解析字符串生成时间 生成当前时间 可以使用ja…

    Java 2023年5月20日
    00
  • 聊聊在Servlet中怎么上传文件

    当我们需要上传大文件或者一些二进制文件到服务器上的时候,需要使用文件上传功能。下面是在Servlet中实现文件上传的完整攻略: 1. 导入依赖 在pom.xml文件中加入以下依赖: <dependency> <groupId>commons-fileupload</groupId> <artifactId>co…

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