SpringBoot利用validation实现优雅的校验参数

下面我将详细讲解“SpringBoot利用validation实现优雅的校验参数”的攻略,包括对应的示例。

什么是validation?

validation 是 validation JSR-303 规范中的校验框架。它提供了很多预置的注解,可以适用于大多数的校验场景,同时支持自定义注解进行校验。

SpringBoot如何使用Validation

SpringBoot 支持对方法参数和请求参数进行校验。一般情况下,我们可以通过编写校验类(通常放在 request 文件夹下),然后在 Controller 层中调用,并标记需要校验的参数。

环境配置

首先需要在 pom.xml 中导入 validation 和相关的 Hibernate-Validator 依赖。示例:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <version>${spring.boot.version}</version>
</dependency>
<dependency>
  <groupId>org.hibernate.validator</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>6.0.13.Final</version>
</dependency>

编写校验注解

我们通常会在 request 文件夹下,编写校验类,来进行具体的参数校验。而这些参数校验可以使用 validation 中自带的注解进行标记。这里给出一个 NewUserRequest 的示例校验类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class NewUserRequest {

  @NotBlank(message = "用户名不能为空")
  @Size(min = 2, max = 10, message = "用户名长度为2-10")
  private String username;

  @Email(message = "邮箱地址格式不正确")
  private String email;

  @NotNull(message = "年龄不能为空")
  @Min(value = 18, message = "年龄必须大于18岁")
  @Max(value = 150, message = "年龄必须小于150岁")
  private Integer age;

}

上述代码中,我们可以看到使用了很多 validation 中自带的注解来进行了各种校验;比如说:

  • @Size(min = 2, max = 10, message = "用户名长度为2-10"):对用户名进行长度校验,并定义了错误信息;
  • @Email(message = "邮箱地址格式不正确"):对邮箱格式进行校验,并定义了错误信息;
  • @NotNull(message = "年龄不能为空")@Min(value = 18, message = "年龄必须大于18岁")@Max(value = 150, message = "年龄必须小于150岁") 分别对年龄进行非空校验和范围校验,并定义了错误信息。

在Controller层使用校验

在 Controller 层中,我们可以根据具体业务逻辑,标记需要校验的参数。当参数不符合要求时,将抛出 MethodArgumentNotValidException 异常,我们可以通过统一的异常处理器进行处理。这里给出示例代码:

@RestController
public class UserController {

  @PostMapping("/users")
  public void addUser(@RequestBody @Valid NewUserRequest request) {
     // 省略具体业务逻辑
  }

  // 异常处理器
  @ExceptionHandler(MethodArgumentNotValidException.class)
  public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
    List<ObjectError> objectErrors = e.getBindingResult().getAllErrors();
    return R.fail(objectErrors.get(0).getDefaultMessage());
  }
}

上述代码中,我们在 Controller 层的 addUser() 方法标注了 @Valid 注解,代表需要校验此参数,在参数校验失败时,将会触发 MethodArgumentNotValidException 异常,我们则通过 handleMethodArgumentNotValidException() 异常处理方法,统一处理异常并返回错误信息。

至此,我们就完成了一个优雅的参数校验示例。

示例

上面仅仅是提供了一个参数校验的示例,下面再简单补充一下自己在做项目时使用参数校验的例子。

假设我们需要编写一个商品服务接口,需要进行以下参数校验:

  • 商品的名称不为空,且长度在 2 到 20 个字符之间;
  • 商品的售价不能为负数;
  • 商品的数量不能为负数。

根据上述要求,我们编写一个 Goods 参数类,并在其中使用 validation 注解进行校验,示例代码如下:

@Data
public class Goods {

  @NotBlank(message = "商品名称不能为空")
  @Size(min = 2, max = 20, message = "商品名称长度在2-20个字符内")
  private String name;

  @DecimalMin(value = "0", message = "商品售价不能为负数")
  private BigDecimal price;

  @Min(value = 0, message = "商品数量不能为负数")
  private Integer count;

}

我们在 Controller 层中需要进行校验的方法,可以直接在参数列表中标注 @Valid 注解,并在方法中捕获校验异常,并进行统一处理。具体示例代码如下:

@RestController
@RequestMapping("/goods")
public class GoodsController {

  @PostMapping("")
  public R addGoods(@RequestBody @Valid Goods goods, BindingResult result) {
    if (result.hasErrors()) {
      return R.fail(result.getFieldError().getDefaultMessage());
    }
    // 业务逻辑处理
    return R.ok();
  }

  // 统一异常处理
  @ExceptionHandler(MethodArgumentNotValidException.class)
  public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
    return R.fail(e.getBindingResult().getFieldError().getDefaultMessage());
  }
}

在上述代码中,我们在 addGoods() 方法中标注了 @Valid 注解,代表需要校验方法的参数。当参数校验失败时,将会触发 MethodArgumentNotValidException 异常,我们统一捕获并处理异常,然后返回错误信息给用户。

这一示例中,我们使用了统一的异常处理器方法 handleMethodArgumentNotValidException() 进行异常处理,以实现统一的错误信息返回。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot利用validation实现优雅的校验参数 - Python技术站

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

相关文章

  • JAVA如何把数据库的数据处理成树形结构

    对于将数据库中的数据处理成树形结构,大致可以分为以下三步: 从数据库中获取原始数据 将原始数据转化为树形结构数据 将树形结构数据渲染到前端页面 1.从数据库中获取原始数据 我们首先要从数据库中获取原始数据,一般情况下,我们可以通过使用JDBC操作数据库实现该功能。 示例代码如下: import java.sql.Connection; import java…

    Java 2023年5月20日
    00
  • Java 实战项目之小说在线阅读系统的实现流程

    首先让我们来讲解一下“Java 实战项目之小说在线阅读系统的实现流程”。 1. 系统功能需求分析 在开发小说在线阅读系统之前,我们需要对系统的功能需求进行分析,以确保开发出的系统能够满足用户的要求。在这个阶段,我们需要做以下工作: 确定系统的用户类型:读者、作者和管理员等。 确定系统的基本功能模块:用户注册、登录、小说分类、小说搜索、在线阅读、小说管理、用户…

    Java 2023年5月24日
    00
  • MyBatis传入数组集合类并使用foreach遍历

    MyBatis是一款流行的Java ORM框架,可以用于简化数据库操作。这里将详细讲解如何在MyBatis中传入数组集合类并使用foreach进行遍历。 第一步:传入数组集合类 在MyBatis中,可以通过使用@Param注解来传递参数。@Param注解需要指定参数的名称,例如: <select id="selectUsersByIds&qu…

    Java 2023年5月26日
    00
  • 如何验证Tomcat Gzip配置是否生效的方法

    当我们在Tomcat中配置gzip压缩后,我们需要一些方法来验证我们的配置是否生效。下面提供了两种方法来验证Tomcat Gzip配置是否生效的方法: 方法1:检查HTTP请求头中是否包含“Content-Encoding: gzip” 验证Tomcat Gzip配置是否生效的方法之一是检查HTTP响应头是否包含“Content-Encoding: gzip…

    Java 2023年5月19日
    00
  • java实现jdbc查询结果集result转换成对应list集合

    将查询结果集result转换成对应的list集合是Java应用程序开发中经常需要实现的任务之一。下面是具体的步骤: 1. 引入相关的依赖 如果你使用的是Maven项目,需要在pom.xml文件中引入相关依赖。例如,引入mysql-connector-java驱动程序,可以添加以下依赖: <dependency> <groupId>my…

    Java 2023年6月16日
    00
  • java的jps命令使用详解

    Java的jps命令使用详解 jps命令是Java提供的一个实用工具,用于显示当前机器上所有正在运行的Java进程以及它们的PID(进程标识符)和类名。它通常被用于快速查看Java进程的运行状态,因此是Java程序调试和性能优化的重要工具之一。 语法 jps 命令的基本语法如下: jps [ options ] [ hostid ] 其中,hostid 指定…

    Java 2023年5月26日
    00
  • Java基于jdbc连接mysql数据库操作示例

    下面是Java基于JDBC连接MySQL数据库操作的完整攻略,包含两条示例。 步骤一:准备工作 在开始Java程序连接MySQL数据库之前,需要完成以下几个准备工作: 安装MySQL数据库并创建需要操作的数据库和表 下载并安装Java JDK 下载并安装MySQL Connector/J驱动程序 步骤二:创建数据库连接 请按照以下步骤创建数据库连接: 加载M…

    Java 2023年5月19日
    00
  • 详解Spring Security 捕获 filter 层面异常返回我们自定义的内容

    下面是详解“详解Spring Security 捕获 filter 层面异常返回我们自定义的内容”的完整攻略: 简介 Spring Security是一个强大的安全框架,可以帮助开发者快速集成认证、授权等安全相关功能。在使用Spring Security过程中,可能会遇到一些异常或错误。这时,我们需要捕获这些异常,并返回自定义的错误信息。本文将围绕如何在Sp…

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