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日

相关文章

  • Spring SpringMVC在启动完成后执行方法源码解析

    在Spring和SpringMVC中,我们可以在启动完成后执行一些方法。本文将详细讲解Spring和SpringMVC在启动完成后执行方法的源码解析,并提供两个示例说明。 Spring中启动完成后执行方法 在Spring中,我们可以使用ApplicationListener接口来监听ApplicationContext的启动事件。下面是一个示例: @Comp…

    Java 2023年5月18日
    00
  • 解析Java的Jackson库中对象的序列化与数据泛型绑定

    下面是详细讲解“解析Java的Jackson库中对象的序列化与数据泛型绑定”的完整攻略: 什么是Jackson库? Jackson是一个用于JSON序列化和反序列化的Java库,它能够将Java对象序列化为JSON格式,以及将JSON格式的数据反序列化为Java对象。 Jackson中的对象序列化 在Jackson中,对象序列化的实现通常基于对象映射(Obj…

    Java 2023年5月26日
    00
  • java中@requestMappling注解的使用

    Java中@RequestMapping注解的使用 在Java中,@RequestMapping注解是一个非常常用的注解,它用于将HTTP请求映射到控制器的处理方法上。在本文中,我们将详细讲解@RequestMapping注解的使用,并提供两个示例来说明如何使用这个注解。 基本用法 @RequestMapping注解可以用于类级别和方法级别。在类级别上使用@…

    Java 2023年5月18日
    00
  • js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)

    当用户需要上传图片时,常见的方式是通过点击上传按钮或将图片拖拽到上传区域进行上传。但是,这个过程可能会比较繁琐,用户需要先将图片从电脑上选择出来或者用截图工具进行截图,然后才能进行上传操作。 为了提高用户的上传体验,我们可以通过JS实现Ctrl+V粘贴上传图片的功能。具体实现过程如下: 获取粘贴板上的图片数据 首先,需要监听网页上的粘贴事件,在用户按下Ctr…

    Java 2023年6月15日
    00
  • 详解Spring Boot 使用Java代码创建Bean并注册到Spring中

    这里我们将分步骤地详解如何使用Java代码创建Bean并注册到Spring中。 步骤一:创建Bean 我们要创建一个简单的Java类,并使用@Component注解将其标记为Spring Bean。示例代码如下: import org.springframework.stereotype.Component; @Component public class …

    Java 2023年5月19日
    00
  • SpringMVC注解的入门实例详解

    下面是“SpringMVC注解的入门实例详解”的完整攻略。 1. SpringMVC注解概述 SpringMVC注解是Spring框架提供的一种简化开发的方式。它的主要作用是简化开发,让开发者更加专注于业务逻辑代码的实现,而不必过多地关注与框架的集成。SpringMVC注解是基于Java的元注解体系,它提供了很多注解用于标记业务处理代码和控制器以及请求参数等…

    Java 2023年5月16日
    00
  • Java下载文件的4种方式总结

    以下是Java下载文件的4种方式总结的详细攻略: 一、通过URL类下载文件 Java中可以通过URL类来下载远程文件,具体步骤如下: 创建一个URL对象,指定远程文件的URL地址; URL url = new URL("http://example.com/file/file.txt"); 打开URL连接; URLConnection c…

    Java 2023年5月20日
    00
  • spring boot与ktor整合的实现方法

    下面我将详细讲解“Spring Boot与Ktor整合的实现方法”的完整攻略,并提供两个示例。 Spring Boot与Ktor整合 1. 环境准备 在开始整合前,需要准备好以下环境: JDK 8以上版本 Gradle 4以上版本 Spring Boot 2以上版本 Ktor 1以上版本 2. Spring Boot项目搭建 首先,需要新建一个Spring …

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