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 SpringBoot+vue+实战项目详解

    Java SpringBoot+Vue实战项目,可以分为后端和前端两个部分。下面将详细讲解如何使用SpringBoot和Vue来创建一个完整的Web应用程序。 后端SpringBoot SpringBoot是一个用于快速开发基于Spring框架的Web应用程序的开源框架。下面将详细讲解如何使用SpringBoot来创建一个完整的Web应用程序。 步骤1:创建…

    Java 2023年5月19日
    00
  • Springboot之整合Socket连接案例

    在Spring Boot应用程序中,我们可以使用Socket连接来实现客户端和服务器之间的通信。以下是实现Spring Boot整合Socket连接的完整攻略: 创建服务器端 在Spring Boot应用程序中,我们可以创建一个服务器端来监听客户端的连接请求。以下是一个示例: @Component public class SocketServer { pr…

    Java 2023年5月15日
    00
  • Java中实现双数组Trie树实例

    实现双数组Trie树实例 在本文中,我们将学习如何在Java中使用双数组Trie树实现基于字典的字符串查找和匹配。 前置知识 在学习本文之前,你需要熟悉以下几个概念: Trie树:基于字符串构建的树状结构,用于快速搜索和匹配字符串。 双数组Trie树(Double-Array Trie,简称DAT):对Trie树进行空间优化的一种实现方式。 双数组Trie树…

    Java 2023年5月26日
    00
  • JAVA时间存储类Period和Duration使用详解

    JAVA时间存储类Period和Duration使用详解 在JAVA中,时间的处理是经常会遇到的问题。为了更方便地处理时间,JAVA提供了java.time包,其中包含了两个非常重要的时间存储类Period和Duration。下面我们就一起来详细了解它们的使用方法以及注意事项。 Period Period类是用于表示时间段的类,它包含了年、月、日等信息。 创…

    Java 2023年5月20日
    00
  • JavaEE Spring MyBatis如何一步一步实现数据库查询功能

    一、概述JavaEE 是一个企业级应用开发框架,Spring 是 JavaEE 中最常用的框架之一,MyBatis 是一款优秀的 ORM 框架,通过使用这三个框架,可以轻松实现一个 JavaEE 企业级应用。本文将以一个简单的文章阅读网站为例,介绍 JavaEE Spring MyBatis 如何一步一步实现数据库查询功能。 二、环境准备1. JDK 1.8…

    Java 2023年5月31日
    00
  • Java基础之常用的命令行指令

    Java基础之常用的命令行指令 在使用Java开发中,经常需要在命令行中执行一些操作,例如编译、运行Java程序等。下面是常用的命令行指令及其作用。 javac javac是Java编译器,可以将Java源代码编译成Java字节码文件(.class文件)。使用方法如下: javac HelloWorld.java 上述指令将会编译HelloWorld.jav…

    Java 2023年5月19日
    00
  • SpringBoot 定制化返回数据的实现示例

    下面是关于「SpringBoot 定制化返回数据的实现示例」的完整攻略,包含以下内容: 背景介绍 基本思路 实现步骤 示例说明 背景介绍 在实际开发中,我们经常需要对接口返回数据进行定制化处理。例如,有时候我们需要统一的返回格式、或者在某些接口中需要添加额外的字段信息。这时候,我们就需要对 SpringBoot 中默认的返回数据进行定制化处理。 基本思路 S…

    Java 2023年5月26日
    00
  • WEB常见漏洞问题危害及修复建议

    WEB常见漏洞问题危害及修复建议 1. 漏洞问题概述 WEB常见漏洞是指在Web应用程序的设计、开发、运维、维护等各个环节中可能存在的安全隐患。常见的Web安全漏洞有SQL注入、跨站脚本攻击、文件包含漏洞、不安全文件上传、恶意重定向、Session劫持、CSRF攻击等。 这些漏洞问题会造成以下危害: 数据丢失或数据泄露:攻击者可能会利用这些漏洞访问、修改、删…

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