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日

相关文章

  • java基础中异常及包归纳整理

    Java基础中异常及包归纳整理 Java作为一门高级面向对象编程语言,具有强大的异常处理机制和模块化编程的“包”机制。以下是关于Java基础中异常及包的归纳整理。 异常(Exception) Java中把程序运行中发生的不正常情况称为“异常”。异常分为两大类:受查异常和非受查异常。受查异常是指在使用一个类或者方法时,必须对其进行异常处理(try-catch或…

    Java 2023年5月27日
    00
  • 使用.htaccess设置图片防盗链的详细方法

    下面是使用.htaccess设置图片防盗链的详细攻略: 什么是图片防盗链 图片防盗链是指防止其他网站直接调用你的图片资源,从而减少被盗取的风险和减少服务器资源的消耗。为了防止盗链,我们可以使用.htaccess文件来进行防盗链设置。 设置图片防盗链的方法 1. 查找.htaccess文件 在网站的根目录下(一般是public_html或htdocs文件夹),…

    Java 2023年6月15日
    00
  • SpringMVC+Mybatis二维码实现多平台付款(附源码)

    下面我将详细讲解“SpringMVC+Mybatis二维码实现多平台付款(附源码)”的完整攻略。 1. 概述 本文介绍如何使用SpringMVC和Mybatis实现多平台付款系统,主要包括以下几个方面。 使用SpringMVC实现Web应用程序的开发; 使用Mybatis对数据库进行访问; 使用二维码实现多平台付款。 2. 开发环境和技术栈 JDK 1.8 …

    Java 2023年5月26日
    00
  • Java版水果管理系统源码

    Java版水果管理系统源码攻略 系统介绍 Java版水果管理系统源码是一款基于Java语言开发的水果供应管理系统,主要用于管理水果供应链上的各个环节,包括水果添加、修改、删除、查看等功能,同时还支持销售管理、库存管理、供应商管理等功能,满足了水果供应管理中的各种需求。该系统使用MVC设计模式,采用Java Swing作为前端界面开发框架,使用MySQL数据库…

    Java 2023年5月24日
    00
  • java实现简单的小超市程序

    Java实现简单的小超市程序攻略 需求分析 在实现小超市程序之前,我们需要了解程序的需求。假设我们需要实现以下功能: 商品信息的录入和展示 商品的购买和结算 支持会员折扣和促销活动 设计思路 在了解需求之后,我们再来规划一下小超市程序的设计思路。 商品实体类 首先我们需要设计一个商品的实体类,包括商品名称、单价、库存、条形码等属性。 超市类 我们还需要设计一…

    Java 2023年5月18日
    00
  • 关于RequestMapping注解的作用说明

    关于@RequestMapping注解的作用说明 @RequestMapping注解是Spring框架中最常用的注解之一,它可以用来映射URL和处理HTTP请求,是控制器中的一个方法级别的注解。下面将详细介绍@RequestMapping的作用和使用说明。 基本作用 @RequestMapping注解用于将指定的URL映射到处理请求的控制器方法上。当请求UR…

    Java 2023年6月15日
    00
  • 详解Spring3.x 升级至 Spring4.x的方法

    那我来为您讲解一下“详解Spring3.x 升级至 Spring4.x的方法”的完整攻略。 1. 升级前的准备工作 首先,我们需要备份现有的代码,并记录当前的 Spring 版本。然后,我们需要检查我们的代码是否依赖于废弃的 API,以免在升级后出现问题。同时,我们还需准备升级所需的依赖项和工具,如 Maven 或 Gradle。 2. 升级 Spring …

    Java 2023年5月19日
    00
  • MyBatis-Plus详解(环境搭建、关联操作)

    MyBatis-Plus详解(环境搭建、关联操作) 环境搭建 添加依赖 在 pom.xml 文件中添加 MyBatis-Plus 的依赖。 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter<…

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