SpringBoot如何优雅的处理校验参数的方法

当我们使用SpringBoot开发项目时,校验参数是一个很常见的需求。如何优雅地处理校验参数,可以让我们的代码更加简洁易懂,也能更好地保证代码的可维护性。下面我将分享一些处理校验参数的优雅方法。

1. 使用Hibernate Validator

Hibernate Validator是一个基于JSR 303规范的校验框架,它可以让我们非常方便地对参数进行校验,同时还支持国际化和自定义校验器。

首先在pom.xml中添加依赖:

<!-- Hibernate Validator -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.2.0.Final</version>
</dependency>

然后在需要校验参数的类上添加@Validated注解,在需要校验的参数上添加对应的校验注解,如@NotBlank@Min@Max等,示例代码如下:

@RestController
@RequestMapping("/user")
@Validated
public class UserController {

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody @Valid User user) {
        // 创建用户
        return ResponseEntity.ok(user);
    }
}

此时如果请求参数不满足校验条件,会返回一个400错误,并提示具体的错误信息。

2. 定义全局异常处理器处理校验失败的异常

虽然使用Hibernate Validator可以方便地处理校验参数,但是我们可能需要处理校验失败的异常,以便返回给前端正确的错误信息。

我们可以定义全局异常处理器(@ControllerAdvice注解),捕获校验参数失败的异常,并将错误信息封装成我们定义的标准返回格式,如下所示:

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ResponseData handleValidationException(MethodArgumentNotValidException ex) {
        BindingResult result = ex.getBindingResult();
        String message = result.getFieldErrors().stream()
                .map(FieldError::getDefaultMessage)
                .collect(Collectors.joining(","));

        return ResponseData.fail(ResultCode.PARAMS_INVALID.getCode(), message);
    }
}

这样,当参数校验失败时,我们就能够返回一个标准的错误信息给前端了。

示例

下面是一个示例,演示了如何使用Hibernate Validator校验请求参数,并处理校验失败的异常:

@RestController
@RequestMapping("/user")
@Validated
public class UserController {

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody @Valid User user) {
        // 创建用户
        return ResponseEntity.ok(user);
    }

    @ControllerAdvice
    @ResponseBody
    public class GlobalExceptionHandler {

        @ExceptionHandler(MethodArgumentNotValidException.class)
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        public ResponseData handleValidationException(MethodArgumentNotValidException ex) {
            BindingResult result = ex.getBindingResult();
            String message = result.getFieldErrors().stream()
                    .map(FieldError::getDefaultMessage)
                    .collect(Collectors.joining(","));

            return ResponseData.fail(ResultCode.PARAMS_INVALID.getCode(), message);
        }
    }
}

public class User {

    @NotBlank(message = "用户名不能为空")
    private String username;

    @Min(value = 18, message = "年龄不能小于18岁")
    private Integer age;

    // getter/setter省略...
}

这个示例中,我们使用了@NotBlank@Min注解对参数进行了校验。当请求参数不符合要求时,会返回以下错误信息:

{
  "code": "20001",
  "message": "用户名不能为空,年龄不能小于18岁",
  "data": null
}

总结:使用Hibernate Validator可以方便地处理校验参数,而定义全局异常处理器可以让我们更好地处理校验失败的异常。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot如何优雅的处理校验参数的方法 - Python技术站

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

相关文章

  • Java日常练习题,每天进步一点点(11)

    Java日常练习题是一组有关Java语言的练习题,可以帮助练习者巩固Java语言的基础知识,提高编程技巧和解决问题的能力。以下是本文对“Java日常练习题,每天进步一点点(11)”进行详细讲解的攻略。 1.题目描述 “Java日常练习题,每天进步一点点(11)”所涉及的题目包含以下几个方面: 如何计算一个数组的和; 如何计算一个数组的平均值; 如何查找数组中…

    Java 2023年5月26日
    00
  • Java interrupt()方法使用注意_动力节点Java学院整理

    Java中的interrupt()方法用于中断线程的执行。但是,在使用interrupt()方法时需要注意一些问题。下面是使用Java interrupt()方法的注意事项: 1. 如何中断线程? 使用interrupt()方法中断线程,有以下几个步骤: 在线程中使用isInterrupted()或Thread.interrupted()等方法获取中断状态。…

    Java 2023年5月27日
    00
  • Java数组的去重

    Java数组去重是一个非常基础和常见的操作,本文将介绍两种常见的去重方法:使用Set去重和使用Stream去重。 使用Set去重 使用Set来去重是最为常见的一种方式,其原理很简单,就是将数组转换为Set,再将Set转换为数组即可。 示例代码如下: public static int[] removeDuplicates(int[] arr) { Set&l…

    Java 2023年5月26日
    00
  • Java编程获取文件列表及子文件目录的方法(非递归)

    Java编程获取文件列表及子文件目录的方法(非递归) 在Java编程中,我们有时需要获取某个目录下的所有文件及其子文件目录,这个过程需要使用一些Java API来完成。下面我们来介绍一种获取文件列表及子文件目录的非递归方法。 方法说明 我们可以使用Java中的File类来获取文件列表及子文件目录,File类中的listFiles()方法可以获取某个目录下的所…

    Java 2023年5月20日
    00
  • 详解基于java的Socket聊天程序——服务端(附demo)

    详解基于java的Socket聊天程序——服务端(附demo)攻略 1. 简介 本文将详细介绍如何使用Java中的Socket编写一个简单的聊天程序。文章分为客户端和服务端两部分,本文将着重讲解服务端的实现过程,并提供对应示例代码。 2. 整体流程 创建ServerSocket 等待客户端连接,创建Socket 创建线程处理客户端连接 服务端处理客户端的消息…

    Java 2023年5月19日
    00
  • Java多线程常见案例分析线程池与单例模式及阻塞队列

    Java多线程常见案例分析线程池与单例模式及阻塞队列攻略 什么是多线程? 在计算机科学中,多线程(英语:Multithreading)指的是同时运行多个线程执行不同的任务。在线程中,单个处理器(或核心)会执行多个并发执行的任务。这是在现代操作系统中实现并发的一种方式。 什么是线程池? 线程池是预先实例化一定数量的线程,并在它们启动时将它们放入池中。每个任务都…

    Java 2023年5月19日
    00
  • Java AES256加密解密示例代码

    下面是Java AES256加密解密示例代码的完整攻略: Java AES256加密解密示例代码 什么是AES256加密? AES256是一种对称加密算法,也就是说加密和解密都使用相同的密钥。AES256使用256位密钥长度,目前被认为是一种非常安全的加密算法。在Java中,可以使用javax.crypto包中的类来实现AES256加密。 AES256加密解…

    Java 2023年5月19日
    00
  • Java 如何利用缓冲流读写文件

    Java 可以通过缓冲流来读写文件,缓冲流会将 I/O 操作的数据缓存起来,通过缓存操作可以减少访问磁盘次数,进而提升程序的性能。下面是利用缓冲流读写文件的步骤: 创建输入流对象。首先需要创建一个文件输入流对象(FileInputStream),再把它作为参数传给缓冲输入流(BufferedInputStream)的构造方法,从而创建一个缓冲输入流对象(例如…

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