SpringBoot之groups应对不同的Validation规则自定义方式

下面是详细讲解“SpringBoot之groups应对不同的Validation规则自定义方式”的完整攻略。

什么是Validation

Validation是指对象验证,是一种可以验证Java对象的一组功能。在Java中,我们通常使用JSR 303规范中提供的Validation API来完成对象验证。

什么是Validation groups

Validation groups是Validation API中的一种概念。它允许我们将验证规则分组,从而能够让我们针对不同的场景使用不同的验证规则。

如何自定义Validation rules with group

在Spring Boot中使用Validation API,我们可以通过自定义Validation rules with group来实现利用groups应对不同的Validation规则。

具体实现步骤如下:

  1. 定义Validation Group
    我们需要定义出多个Validation Group。例如,我们可以定义出CreateGroup、UpdateGroup、DeleteGroup等Group,分别对应创建、更新、删除API的输入参数。定义方式如下:

```java
public interface CreateGroup { }

public interface UpdateGroup { }

public interface DeleteGroup { }
```

  1. 在需要进行参数验证的接口输入参数上使用@Validated注解,同时指定要进行验证的Group。例如:

java
public ResultDTO<?> create(@Validated(CreateGroup.class) @RequestBody CreateUserDTO createUserDTO) { }

  1. 在输入参数类上使用注解@GroupSequence,定义Group的顺序。例如:

```java
public class CreateUserDTO {

   @NotNull(groups = {CreateGroup.class})
   private String name;

   @Min(value = 18, groups = {CreateGroup.class})
   private Integer age;

   @NotNull(groups = {UpdateGroup.class})
   private Long id;

   @GroupSequence({CreateGroup.class, UpdateGroup.class})
   public interface Group { }

}
```

这样,在执行参数验证时,会按照指定的Group顺序逐个验证。

  1. 在需要对某个Group使用自定义验证规则时,我们需要自定义验证类,并且让它实现javax.validation.ConstraintValidator接口。例如,我们需要对CreateGroup进行自定义验证,规则为:对象长度不能小于3。实现如下:

```java
public class CreateGroupValidator implements ConstraintValidator {

   @Override
   public boolean isValid(Object value, ConstraintValidatorContext context) {
       if (value == null) {
           return true;
       }
       return value.toString().length() >= 3;
   }

}
```

  1. 在需要使用自定义验证规则的属性上使用自定义注解,例如,我们需要对name属性使用自定义验证规则,实现如下:

java
@NotNull(groups = {CreateGroup.class})
@CreateGroupValidator(groups = {CreateGroup.class}, message = "长度不能小于3")
private String name;

这样,我们就成功地利用groups应对不同的Validation规则,并且实现了自定义的验证规则。下面,我来举两个简单的例子。

例子一:对输入参数进行校验

我们有一个用户管理系统,其中有一个创建用户的接口。输入参数为一个JSON格式的DTO对象,其中包含用户名和年龄两个字段。我们希望在创建用户时,能够对输入参数进行验证,避免出现不合法数据。

首先,我们引入Validation API依赖,定义出CreateGroup:

public interface CreateGroup { }

我们在输入参数类上使用注解@GroupSequence,定义Group的顺序,同时标注出要验证的属性及其规则:

@Data
@NoArgsConstructor
public class CreateUserDTO {

    @NotNull(groups = {CreateGroup.class})
    @Length(min = 1, max = 20, groups = {CreateGroup.class}, message = "长度必须为1-20个字符")
    private String name;

    @NotNull(groups = {CreateGroup.class})
    @Min(value = 0, groups = {CreateGroup.class}, message = "年龄必须大于等于0")
    @Max(value = 150, groups = {CreateGroup.class}, message = "年龄不能大于150")
    private Integer age;

    @GroupSequence({CreateGroup.class})
    public interface Group { }
}

我们在控制器上加上注解@Validated,并指定创建时需要验证CreateGroup。同时,在控制器方法中在输入参数上标注@RequestBody注解:

@RestController
@RequestMapping(value = "/users")
@Validated
public class UserController {

    @PostMapping
    public ResultDTO<?> create(@Validated(CreateUserDTO.Group.class) @RequestBody CreateUserDTO createUserDTO) {
        // 写业务代码
        return new ResultDTO<>();
    }
}

现在,我们来测试一下这个接口,看看它对于不合法的输入参数是否能够真正地进行校验:

  1. 测试数据:

json
{
"name": "",
"age": -1
}

  1. 发送请求,预期结果:

{
"code": "InvalidArgument",
"message": "参数错误",
"data": {
"name": [
"长度必须为1-20个字符"
],
"age": [
"年龄必须大于等于0"
]
}
}

  1. 测试数据:

json
{
"name": "test",
"age": 1500
}

  1. 发送请求,预期结果:

{
"code": "InvalidArgument",
"message": "参数错误",
"data": {
"age": [
"年龄不能大于150"
]
}
}

我们可以发现,因为设置了Validation Group,这个接口能够很好地对输入参数进行校验。

例子二:对属性进行自定义校验

我们有一个管理学校课程的系统,它包括若干个课程信息。课程信息包含了课程名称和老师名称两个字段。我们希望在创建新课程信息时,对课程名称和老师名称进行校验。其中,对于课程名称,我们希望其长度不能小于3;对于老师名称,我们希望其以"Teacher_"开头。

首先,我们引入Validation API依赖,并定义自定义Annotation:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = TeacherNameValidator.class)
public @interface TeacherName {

    String message() default "老师名称必须以 \"Teacher_\" 开头";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}

我们实现ConstraintValidator接口:

public class TeacherNameValidator implements ConstraintValidator<TeacherName, String> {

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        }
        return value.startsWith("Teacher_");
    }
}

我们在输入参数类上定义Group,并使用@TeacherName注解标注老师名称属性:

@Data
@NoArgsConstructor
public class CourseDTO {

    @NotNull(groups = {CreateGroup.class})
    @Length(min = 3, max = 20, groups = {CreateGroup.class}, message = "长度必须在3-20个字符之间")
    private String name;

    @TeacherName(groups = {CreateGroup.class}, message = "老师名称必须以 \"Teacher_\" 开头")
    private String teacher;

    @GroupSequence({CreateGroup.class})
    public interface Group { }
}

在控制器上加上注解@Validated,并指定创建时需要验证CreateGroup。同时,在控制器方法中在输入参数上标注@RequestBody注解:

@RestController
@RequestMapping(value = "/courses")
@Validated
public class CourseController {

    @PostMapping
    public ResultDTO<?> create(@Validated(CourseDTO.Group.class) @RequestBody CourseDTO courseDTO) {
        // 写业务代码
        return new ResultDTO<>();
    }
}

现在,我们来测试一下这个接口,看看它对于不合法的输入参数是否能够真正地进行校验:

  1. 测试数据:

json
{
"name": "A",
"teacher": "B"
}

  1. 发送请求,预期结果:

{
"code": "InvalidArgument",
"message": "参数错误",
"data": {
"name": [
"长度必须在3-20个字符之间"
],
"teacher": [
"老师名称必须以 \"Teacher_\" 开头"
]
}
}

  1. 测试数据:

json
{
"name": "Java",
"teacher": "Teacher_Li"
}

  1. 发送请求,预期结果:

{
"code": "OK",
"message": "创建成功",
"data": null
}

在这个例子中,我们对多个属性进行了不同的Validation规则的自定义,而且它们都成功地被执行了。

至此,我们就完成了“SpringBoot之groups应对不同的Validation规则自定义方式”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot之groups应对不同的Validation规则自定义方式 - Python技术站

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

相关文章

  • js-tab选项卡

    下面是关于js-tab选项卡的详细攻略: 什么是js-tab选项卡? js-tab选项卡是一种常见的页面交互效果,用于切换页面上不同部分的内容展示。通常包括多个选项卡(如“首页”、“产品介绍”等)和每个选项卡对应的内容区域,通过点击选项卡来切换对应的内容展示。 实现js-tab选项卡的步骤 要实现js-tab选项卡,可以按照以下步骤进行: HTML结构中准备…

    Java 2023年5月23日
    00
  • SpringBoot3.0整合chatGPT的完整步骤

    下面我来讲解“SpringBoot3.0整合chatGPT的完整步骤”的完整攻略。 前置条件 在开始整合chatGPT之前,我们需要做好以下准备工作: 首先,需要具备SpringBoot开发基础和chatGPT的相关知识。 确保已经安装好JDK和Maven,并且配置好环境变量。 获取chatGPT的代码库,设置好相关配置。 步骤一:创建SpringBoot项…

    Java 2023年5月19日
    00
  • win10的java环境该怎么配置?java环境变量配置介绍

    配置Java环境是进行Java开发的第一步,下面我将详细讲解如何在win10系统下配置Java环境。 1. 下载并安装Java Development Kit (JDK) 首先,我们需要从Oracle官网下载适用于Windows 10的Java Development Kit (JDK)。您可以通过以下链接访问下载链接:Java SE Downloads |…

    Java 2023年5月26日
    00
  • Java随手笔记8之包、环境变量和访问控制及maven profile实现多环境打包

    Java随手笔记8之包、环境变量和访问控制及maven profile实现多环境打包 包 在Java中,包是用来管理和组织类的,可以避免类名重复和冲突。包名是由完整类名组成的,例如com.example.myapp。约定俗成的做法是让包名和域名一致。 如何定义包 在Java源代码的开头,使用package关键字来定义包,例如: package com.exa…

    Java 2023年5月19日
    00
  • 基于springboot搭建的web系统架构的方法步骤

    下面详细讲解基于Spring Boot搭建Web系统架构的步骤: 1. 准备工作 在开始构建基于Spring Boot的Web系统之前,需要完成一些准备工作。这些包括:* 安装Java JDK* 安装Eclipse或IntelliJ IDEA等IDE* 安装Maven或Gradle等构建工具 安装完成后,我们就可以开始构建Web系统了。 2. 创建Sprin…

    Java 2023年5月19日
    00
  • jsp页面循环集合操作整理

    一、添加循环代码块 对于jsp页面中的循环集合操作,一般情况下我们需要借助core标签库中的c:forEach标签实现。首先需要导入标签库: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 接着,在需要进行循环的代码块前插入以…

    Java 2023年5月20日
    00
  • 使用cmd根据WSDL网址生成java客户端代码的实现

    使用cmd根据WSDL网址生成java客户端代码的实现,可以分为以下几个步骤: 打开cmd窗口 进入java/bin目录 敲入以下命令,其中”your_web_service_url”为你需要生成代码的WSDL服务的地址,”your_package_name”为你生成的Java代码所在的包名。 wsimport -keep -verbose your_web…

    Java 2023年5月19日
    00
  • String类型转localDate,date转localDate的实现代码

    首先,我们需要了解Java中日期类型的概念。在Java 8之前,我们通常使用java.util.Date类来处理日期,但是这个类在很多方面都存在问题。因此,在Java 8 中引入了java.time包,提供了全新的日期和时间API,其中LocalDate是处理日期的主要类之一。 String类型转LocalDate 将String类型转换为LocalDate…

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