SpringBoot @GroupSequenceProvider注解实现bean多属性联合校验的示例代码

yizhihongxing

校验是Web应用程序中的常见任务之一,Spring框架提供了很多方便的校验注解,如@NotNull@Size等等。但是,在实际应用中,很少有只需要校验单一属性就能满足业务需求,通常需要校验多个属性组合而成的复杂条件。在这种情况下,Spring Boot的@GroupSequenceProvider注解可以派上用场。本文将为您介绍如何使用@GroupSequenceProvider注解进行bean多属性联合校验,并提供两个示例代码。

1.添加依赖

在使用Spring Boot的校验注解时,需要添加spring-boot-starter-validation依赖。在Maven中,可以这样引入:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2.创建实体类

接下来,我们创建一个实体类User,其中包含多个校验属性:

public class User {

    @NotNull(message = "用户名不能为空")
    @Size(min = 3, max = 20, message = "用户名长度必须在3-20个字符之间")
    private String username;

    @NotNull(message = "密码不能为空")
    @Size(min = 6, max = 20, message = "密码长度必须在6-20个字符之间")
    private String password;

    @NotNull(message = "手机号不能为空")
    @Pattern(regexp = "^1[3|4|5|7|8][0-9]\\d{8}$", message = "手机号格式不正确")
    private String phone;

    @NotNull(message = "邮箱不能为空")
    @Email(message = "邮箱格式不正确")
    private String email;
}

该实体类中包括四个属性:usernamepasswordphoneemail,每一个属性都添加了校验注解。

3.创建@GroupSequenceProvider注解

接下来,我们创建一个UserGroupSequenceProvider类,用于指定校验顺序:

public class UserGroupSequenceProvider implements DefaultGroupSequenceProvider<User> {

    @Override
    public List<Class<?>> getValidationGroups(User user) {
        List<Class<?>> groups = new ArrayList<>();
        groups.add(User.class);
        if (!StringUtils.isEmpty(user.getUsername())) {
            groups.add(UsernameValidation.class);
        }
        if (!StringUtils.isEmpty(user.getPassword())) {
            groups.add(PasswordValidation.class);
        }
        if (!StringUtils.isEmpty(user.getPhone())) {
            groups.add(PhoneValidation.class);
        }
        if (!StringUtils.isEmpty(user.getEmail())) {
            groups.add(EmailValidation.class);
        }
        return groups;
    }

}

该类实现了Spring框架的DefaultGroupSequenceProvider接口,其中的getValidationGroups方法通过对判断User实例的各个属性是否为空,来决定校验顺序。

除了User.class外,另外定义了四种组:UsernameValidation.classPasswordValidation.classPhoneValidation.classEmailValidation.class

4.创建各个校验组

我们在User实体类中新建四个接口,来定义各自的校验规则:

public interface UsernameValidation {}
public interface PasswordValidation {}
public interface PhoneValidation {}
public interface EmailValidation {}

5.编写Controller层代码

最后,在Controller层中注入@Valid注解,同时在参数中指定校验的组:

@PostMapping("/users")
public ResponseEntity<User> createUser(@Validated({UsernameValidation.class, PasswordValidation.class, PhoneValidation.class, EmailValidation.class}) @RequestBody User user) {
    // TODO: 业务逻辑处理
    return ResponseEntity.ok(user);
}

以上代码中,我们指定了User实例必须满足UsernameValidation.classPasswordValidation.classPhoneValidation.classEmailValidation.class四个组校验的规则。

示例1:不同属性的校验规则顺序不同

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserTest {

    @Autowired
    private Validator validator;

    @Test
    public void test() {
        User user = new User();
        user.setUsername("user");
        user.setEmail("123");
        user.setPassword("123456");
        user.setPhone("123");
        Set<ConstraintViolation<User>> violations = validator.validate(user);
        for (ConstraintViolation<User> violation : violations) {
            System.out.println(violation.getMessage());
        }
    }

}

以上代码中,我们通过JUnit测试的方式来模拟校验过程。其中,用户的usernamephone属性不满足校验规则,会输出两条相应的提示信息:

用户名长度必须在3-20个字符之间
手机号格式不正确

示例2:不同属性的校验规则顺序相同

接着,我们通过JUnit测试演示不同属性的校验规则顺序相同的情况:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserTest {

    @Autowired
    private Validator validator;

    @Test
    public void test() {
        User user = new User();
        user.setUsername("user");
        user.setPassword("123456");
        user.setPhone("15555555555");
        user.setEmail("123@qq.com");
        Set<ConstraintViolation<User>> violations = validator.validate(user);
        for (ConstraintViolation<User> violation : violations) {
            System.out.println(violation.getMessage());
        }
    }

}

以上代码中,我们把用户的所有属性都设置为合法值,即使不同属性的校验规则顺序相同,也不会出现任何错误提示信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot @GroupSequenceProvider注解实现bean多属性联合校验的示例代码 - Python技术站

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

相关文章

  • 基于SpringBoot整合oauth2实现token认证

    下面将为您详细讲解如何基于SpringBoot整合oauth2实现token认证。 一、OAuth 2.0简介 OAuth 2.0 是一个为了Web应用程序授权授权的标准而开发的协议。OAuth 2.0授权框架用于保护API资源,它通过强制使用与资源分开的授权服务器来执行批准流程,并通过对授予的访问令牌进行的认证来验证访问令牌的有效性。 二、OAuth 2.…

    Java 2023年5月20日
    00
  • Spring Security实现添加图片验证功能

    标题: Spring Security实现添加图片验证功能 正文:Spring Security是一个基于Spring框架的强大的安全框架,提供了身份验证和授权功能。其中,图片验证功能可以帮助我们增强安全性,防止恶意攻击和非法登录。以下是实现添加图片验证功能的完整攻略。 第一步:添加依赖 在项目的pom.xml文件中添加以下依赖: <dependenc…

    Java 2023年6月3日
    00
  • Java实现的双向匹配分词算法示例

    Java实现的双向匹配分词算法是一种在中文分词中比较常用的算法。下面是完整攻略: 算法原理 双向匹配分词算法是通过正反两个方向分别匹配的方法来确定分词位置的。具体来说,它分别从文本的开头和结尾开始匹配,如果正反两边都匹配到了词,则以较短的那个词为准进行分词;如果其中一边没有匹配到词,则从另一边匹配下一个词。 算法实现 在Java中实现双向匹配分词算法的过程,…

    Java 2023年5月19日
    00
  • 使用jmx exporter采集kafka指标示例详解

    以下是关于使用jmx exporter采集kafka指标的完整攻略: 什么是 JMX Exporter? JMX Exporter 是一个自动化采集系统监控指标并将其解析为 Prometheus 指标格式的工具。它允许用户将 JMX 暴露出来的数据转换成 Prometheus 支持的文本格式。 使用 JMX Exporter 采集 Kafka 指标 以下是使…

    Java 2023年5月20日
    00
  • Spring MVC 拦截器 interceptor 用法详解

    Spring MVC 拦截器(Interceptor)用法详解 什么是拦截器 拦截器是Spring MVC框架中的一种增强处理器,拦截器也可以称为过滤器(Filter)或者AOP实现,它可以在请求处理的过程中预处理请求、处理请求和处理完请求后进行后续处理。拦截器可以将特定的处理逻辑应用到整个应用程序或者某个特定的Controller中。 和Servlet的过…

    Java 2023年5月20日
    00
  • Spring常用配置及解析类说明

    下面是“Spring常用配置及解析类说明”的详细攻略。 1. Spring常用配置 1.1 XML配置 Spring框架最初是以XML配置为主的,XML配置的方式包括声明bean和对bean进行依赖注入两个方面。 1.1.1 声明bean 在XML配置文件中,声明bean的方式如下: <bean id="beanId" class=…

    Java 2023年5月19日
    00
  • 非常全面的Java SpringBoot点赞功能实现

    Java SpringBoot点赞功能实现攻略 一、前置知识 在进行本文中介绍的Java SpringBoot点赞功能实现之前,我们需要掌握以下技能: 熟练掌握Java编程语言。 掌握Java SpringBoot框架的基本使用方法。 熟练使用MySQL数据库。 了解前端开发技术,如HTML、CSS、JavaScript等。 二、功能实现步骤 以下是在Jav…

    Java 2023年5月31日
    00
  • Java中JDBC连接数据库详解

    Java中JDBC连接数据库详解 JDBC是Java Database Connectivity的缩写,可以用于连接不同类型的数据库(如MySQL、Oracle等),并进行数据库操作。本篇文章将详细讲解如何在Java中使用JDBC连接数据库。 步骤1:加载JDBC驱动 在使用JDBC连接数据库之前,需要加载相应的数据库驱动。例如,如果要连接MySQL数据库,…

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