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日

相关文章

  • 微信小程序 登陆流程详细介绍

    下面是关于”微信小程序 登陆流程详细介绍”的攻略。 微信小程序登陆流程详细介绍 1. 获取用户信息前的流程 在小程序中进行用户登陆需要分为两步走,首先是获取Code,然后再用Code换取session_key和openid: wx.login({ success: res => { // 成功获取到Code const code = res.code …

    Java 2023年5月23日
    00
  • JAVA多线程之中断机制stop()、interrupted()、isInterrupted()

    Java多线程之中断机制stop()、interrupted()、isInterrupted() 什么是中断机制? 在Java多线程编程中,中断机制是一种线程协作机制。由于线程的正常执行过程中,往往需要等待I/O操作或其它原因,这些等待过程可能会导致程序执行过程被阻塞。因此,一些长时间的阻塞操作如果不能在合理的时间内得到响应,就需要使用中断机制进行打断。通过…

    Java 2023年5月19日
    00
  • 使用Java的Lucene搜索工具对检索结果进行分组和分页

    使用Java的Lucene搜索工具对检索结果进行分组和分页的攻略如下: 1. 准备工作: (1)使用 Maven 构建项目,引入 Lucene 的依赖项。 <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</…

    Java 2023年5月20日
    00
  • SpringBoot @ExceptionHandler与@ControllerAdvice异常处理详解

    下面是SpringBoot @ExceptionHandler与@ControllerAdvice异常处理的详解。 异常处理概述 异常是在程序运行过程中可能出现的错误或意外情况,它会导致程序无法正常执行。在Java中,异常处理是必不可少的一部分,能够提高程序的鲁棒性和可靠性。在SpringBoot中,常见的异常类型包括:空指针异常、请求方法不支持异常、请求参…

    Java 2023年5月27日
    00
  • 什么是对象的创建过程?

    以下是关于“什么是对象的创建过程?”的完整使用攻略: 1. 对象的创建过程 在Java中,对象的创建过程包括以下几个步骤: 类加载:在Java程序运行时,JVM会将类的字节码加载到内存中,并对类进行解析和验证。 分配内存:在类加载完成后,JVM会在堆内存中为对象配一块连续的内存空间。在分配内存时,JVM会根据对象的大小和内存分配策略来确定内存分配方式。 初始…

    Java 2023年5月12日
    00
  • Spring Boot整合持久层之JdbcTemplate多数据源

    来给您讲解一下关于“Spring Boot整合持久层之JdbcTemplate多数据源”的完整攻略。 一、什么是JdbcTemplate多数据源 在使用Spring Boot进行开发时,我们通常会涉及到多个数据库的操作,在这种情况下,我们就需要使用到JdbcTemplate来进行多数据源的操作。JdbcTemplate是一个Spring的JDBC封装类,使用…

    Java 2023年5月20日
    00
  • java时间格式的简单整理

    Java时间格式的简单整理 1. 时间的表示 在Java中,时间可以用两种方式表示: 时间戳:从1970年1月1日00:00:00开始,到现在的毫秒数。 时间对象:用Java中的Date类表示。 在Java 8之前,时间的处理方式比较麻烦,需要使用Date、Calendar等类进行处理。不过在Java 8之后,引入了java.time包,提供了一系列新的类和…

    Java 2023年5月20日
    00
  • LibrarySystem图书管理系统开发(一)

    LibrarySystem图书管理系统开发(一) 概述 本文介绍了一种设计和开发图书管理系统的方法,该系统使用Python编程语言和Django框架开发。 需求 我们的图书管理系统需要具备以下功能: 添加/编辑/删除图书 添加/编辑/删除图书分类 借阅/归还图书 搜索图书 管理员登录 设计 数据库设计 我们需要至少两个相关的数据库表来存储数据: Book 和…

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