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线程之用Thread类创建线程的方法

    Thread类是Java中常用的一个多线程编程类,使用Thread类可以方便的创建和管理多个线程。下面是使用Thread类创建线程的方法的完整攻略: 1. 继承Thread类 使用Thread类创建线程的一种方法是,继承Thread类并实现其run()方法。run()方法是用来定义线程的执行内容的。通过继承Thread类,可以很方便地创建线程对象,并启动线程…

    Java 2023年5月18日
    00
  • Java Apache Commons报错“UnmodifiableException”的原因与解决方法

    “UnhandledException”是Java的ApacheCommons类库中的一个异常,通常由以下原因之一引起: 代码错误:如果代码中存在错误,则可能会出现此异常。例如,可能会使用错误的方法或参数。 系统错误:如果系统中存在错误,则可能会出现此异常。例如,可能会出现内存不足或文件系统错误。 以下是两个实例: 例1 如果代码中存在错误,则可以尝试检查代…

    Java 2023年5月5日
    00
  • tomcat虚拟主机_动力节点Java学院整理

    Tomcat虚拟主机 – 动力节点Java学院整理 Tomcat虚拟主机是指在同一台物理服务器上运行多个独立的Tomcat实例,每个Tomcat实例都拥有自己的配置文件、Web应用程序和独立的运行环境。Tomcat虚拟主机技术可以很好地解决多个Web应用程序同时运行、不互相干扰的问题。 过程 1. 修改host文件 首先需要修改hosts文件,将虚拟主机域名…

    Java 2023年6月2日
    00
  • java自动根据文件内容的编码来读取避免乱码

    为了让Java程序自动根据文件内容的编码来读取,避免乱码问题,可以使用以下步骤: 判断文件编码类型 首先需要判断文件的编码类型,以便正确地读取该文件。可以使用Java提供的 CharsetDetector 工具库来进行判断。该工具库会根据文件内容自动检测文件编码类型。 示例代码: import org.mozilla.universalchardet.Uni…

    Java 2023年5月20日
    00
  • 基于Java数组实现循环队列的两种方法小结

    接下来详细讲解一下“基于Java数组实现循环队列的两种方法小结”的内容。 标题 基于Java数组实现循环队列的两种方法小结 简介 在队列的实现中,循环队列是一种比较常用的方式。本文主要介绍了基于Java数组实现循环队列的两种方法,包括普通循环队列和双端循环队列。 普通循环队列实现 普通循环队列的实现思路是利用数组来存储队列元素,通过两个指针front和rea…

    Java 2023年5月26日
    00
  • java如何使用自己的maven本地仓库详解

    下面是详细的讲解: 一、什么是Maven本地仓库? Maven本地仓库就是Maven自己的仓库,是用于存储Maven项目所需要的jar包、插件和其他依赖的本地仓库。一般情况下,我们使用Maven构建Java项目时会从Maven中央仓库或者私有仓库下载依赖,但是有时候我们需要自己编写的依赖或者其他第三方依赖没有在中央仓库或私有仓库中,那么我们就需要使用自己的本…

    Java 2023年5月20日
    00
  • java反射原理制作对象打印工具

    下面详细讲解一下Java反射原理制作对象打印工具的完整攻略。 什么是Java反射? 在Java中,每个类都有一个Class对象,该对象包含了与类有关的所有信息,包括类名、访问修饰符、字段、方法等。 Java反射就是指:在运行时动态地获取一个类的Class对象,并对该类进行操作的能力。通过Java反射,我们可以在运行时动态地创建对象、调用方法、获取/设置字段的…

    Java 2023年5月26日
    00
  • Spring Boot中使用JDBC Templet的方法教程

    下面是Spring Boot中使用JDBC Template的方法教程。 简介 JDBC Template是Spring框架提供的一种用于简化JDBC操作的工具,它封装了许多常见的JDBC操作,使得开发人员能够通过简单的代码实现JDBC数据访问。本教程将介绍在Spring Boot项目中如何使用JDBC Template进行数据访问。 步骤 以下是使用JDB…

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