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

yizhihongxing

下面我将详细讲解“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实现Fibonacci(斐波那契)取余的示例代码

    下面是Java实现Fibonacci取余的示例代码完整攻略。 什么是斐波那契数列 斐波那契数列是指这样一个数列:0、1、1、2、3、5、8、13、21、34、……。这个数列从第3项开始,每一项都等于前两项之和。 如何实现取余功能 通过取余运算,可以有效地提高程序的效率,避免计算数值过大而发生数据溢出的情况。 在Java中,可以通过取模(%)运算符来实现取余操…

    Java 2023年5月18日
    00
  • 如何利用JAVA实现走迷宫程序

    让我们来详细讲解如何利用JAVA实现走迷宫程序的完整攻略: 1. 确定程序的基本思路 走迷宫问题可以采用递归实现。通过回溯法来找到可以走的路径,并标记这条线路是否可用。实现的基本思路是: 从起点开始,逐步判断是否可以朝上、下、左、右四个方向走。 如果可以,就进入下一个格子,并把当前位置标记为可用。 如果不可以,就回溯到之前的格子,继续判断是否还有其他方向可以…

    Java 2023年5月26日
    00
  • java二分查找插入法

    当需要在已排序数组中查找元素时,可以使用二分查找算法。如果需要向已排序数组中插入元素,可以使用二分查找插入法。 二分查找插入法的主要思路是通过二分查找找到需要插入的元素在数组中的位置,然后将该元素插入到该位置中。以下是具体的步骤: 首先,定义需要查询的元素 target 和已排序的数组 nums,同时记录数组的左右端点 left 和 right。 计算需要查…

    Java 2023年5月19日
    00
  • android studio后台服务使用详解

    下面我将为您详细讲解“Android Studio后台服务使用详解”的完整攻略。 什么是Android Studio后台服务 Android应用在使用时,可能需要执行一些后台任务,比如网络请求、数据上传、数据下载等操作。而这些操作可能需要在应用关闭时仍然能够运行,这时就需要使用到Android的后台服务。 Android后台服务是在应用关闭或者在后台运行时,…

    Java 2023年5月26日
    00
  • SpringBoot创建maven多模块项目实战代码

    下面是创建Spring Boot Maven多模块项目的完整攻略。 1. 创建Maven父级项目 首先,我们需要创建一个Maven父级项目,它将作为我们多模块项目的容器。使用以下命令创建一个空项目: $ mvn archetype:generate -DgroupId=com.example -DartifactId=parent -DarchetypeAr…

    Java 2023年5月19日
    00
  • Spring Boot实现数据访问计数器方案详解

    Spring Boot实现数据访问计数器方案详解 在一个Web应用中,我们经常需要统计某些数据的访问次数,用于后续的分析或优化。Spring Boot提供了丰富的支持来实现这个计数器方案。 步骤一:定义计数器服务 首先我们需要定义一个计数器服务,用于记录各种数据的访问次数。这个服务可以定义为一个Spring Bean,并用注解标记为@Service: @Se…

    Java 2023年5月20日
    00
  • Spring整合Dubbo框架过程及原理解析

    下面是关于“Spring整合Dubbo框架过程及原理解析”的完整攻略: 1. Dubbo框架简介 Dubbo是一款开源的、高性能的Java RPC框架。Dubbo提供了完整的服务治理方案,包括服务注册与发现、服务路由、负载均衡、容错机制等。Dubbo的核心是基于高效的序列化与网络通信框架实现的高性能远程过程调用(RPC)。 2. Spring整合Dubbo …

    Java 2023年5月19日
    00
  • java获取微信accessToken的方法

    Java获取微信accessToken的方法 微信accessToken是通过微信公众平台开发者中心生成的,用于公众号的基础服务。通过接口获取accessToken可以进行一些高级接口的操作。本文主要介绍在Java中如何获取微信accessToken。 1. 请求微信接口获取accessToken 1.1 请求地址 微信接口请求地址:https://api.…

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