SpringBoot参数校验之@Validated的使用详解

下面就为大家详细讲解“SpringBoot参数校验之@Validated的使用详解”。

什么是@Validated

在Spring框架中,我们经常需要对方法入参的校验,以保证参数的正确性。 SpringBoot基于Hibernate Validator,为开发者提供了方便简洁的实现方式:@Validated。

@Validated 用于校验方法入参,可以将该注解放置在类或方法上。放在类上,将对该类所有方法生效。

@Validated 支持的校验注解

@Validated 除了支持 Hibernate Validator 中的约束注解外,还支持 Spring 自己定义的注解,其中包括:

  • @NotBlank, @NotNull, @NotEmpty
  • @Email, @Range, @Length
  • 自定义注解(通过 @ConstraintValidator 实现自定义注解)

@Validated 的使用

使用 @Validated 需要先引入 Hibernate Validator 的依赖:

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.2.0.Final</version>
</dependency>

具体使用示例如下。

方法参数校验

在 Controller 中需要校验的方法入参前加上 @Validated 注解即可。

@RestController
@Validated
public class UserController {

    @PostMapping("/user")
    public String addUser(@RequestBody @Validated User user) {
        userService.addUser(user);
        return "添加用户成功";
    }

}

自定义校验注解

自定义注解需要实现一个 ConstraintValidator 接口,并在使用时通过该注解指定校验器。

下面给出一个自定义的注解 @Phone:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {

    String message() default "电话号码格式不正确";

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

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

}

PhoneValidator 的实现:

public class PhoneValidator implements ConstraintValidator<Phone, String> {

    private static final String PHONE_REGEX = "^1([38]\\d|5[0-35-9]|7[3678])\\d{8}$";
    private boolean required;

    @Override
    public void initialize(Phone constraintAnnotation) {
        required = constraintAnnotation.required();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (required && StringUtils.isBlank(value)) {
            return false;
        } else {
            return Pattern.matches(PHONE_REGEX, value);
        }
    }
}

在需要校验的属性上加上 @Phone 注解即可:

public class User {

    @Phone
    private String phone;

    // setter and getter
}

示例

下面提供两个示例,以便更好地理解 @Validated 校验方法参数的过程。

示例一

有一个简单的用户注册接口需要对请求参数进行校验,要求 username 不为空且长度要在 5-20 之间,而 password 必须更长一些,至少 8 个字符。

@RestController
@Validated
public class UserController {

    @PostMapping("/register")
    public String register(@RequestParam @NotBlank @Length(min = 5, max = 20) String username,
                           @RequestParam @NotBlank @Length(min = 8) String password) {
        return "用户名:" + username + ",密码:" + password;
    }

}

其中带有 @NotBlank 和 @Length 注解的参数均需要通过校验,否则将会返回错误信息。

示例二

通过自定义注解 @Phone 实现对手机号参数进行校验。

@RestController
@Validated
public class UserController {

    @PostMapping("/user")
    public String addUser(@RequestBody @Validated User user) {
        userService.addUser(user);
        return "添加用户成功";
    }

}

public class User {

    private String username;

    @Phone
    private String phone;

    // setter and getter
}

在 User 对象中的属性 phone 上使用了 @Phone 自定义注解,用于校验手机号格式。如果格式不正确,将会抛出错误信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot参数校验之@Validated的使用详解 - Python技术站

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

相关文章

  • nginx proxy_pass指令’/’使用注意事项

    当使用Nginx作为代理服务器时,proxy_pass指令非常重要。它可以用来转发请求给后端服务器。在使用proxy_pass指令时,特别是使用代理根路径时,需要注意一些事项。以下是nginx proxy_pass指令‘/’使用注意事项的完整攻略。 1. 确定目标地址 在使用proxy_pass指令时,首先需要确保已经确定了正确的目标地址。这可以是一个IP地…

    Java 2023年6月15日
    00
  • 面向对象程序设计

    OOP 【面向对象程序设计】(OOP)与【面向过程程序设计】在思维方式上存在着很大的差别。【面向过程程序设计】中,算法是第一位的,数据结构是第二位的,这就明确地表述了程序员的工作方式。首先要确定如何操作数据,然后再决定如何组织数据,以便于数据操作。而【面向对象程序设计】却调换了这个次序,【面向对象程序设计】将数据放在第一位,然后再考虑操作数据的算法。 对于一…

    Java 2023年4月18日
    00
  • 记录一次非常麻烦的调试

    此次记录一次非常麻烦的调试问题,不是纯知识分享,只是记录这次调试过程引以为戒。 问题简介 这个功能是公司2021年写的老功能,一直都没有更新过代码,这次在导入一个1.03G的大文件进行读取的过程中出问题了。简单介绍一下这个功能:公司使用的spring boot框架构建项目,该功能为项目内的一个接口调用功能。该功能首先,通过远程接口下载文件到局域网sftp服务…

    Java 2023年5月5日
    00
  • mysql+spring+mybatis实现数据库读写分离的代码配置

    MySQL数据库读写分离是提高Web应用性能和可用性的重要手段之一。开发人员可以通过使用JDBC、Spring和MyBatis等技术实现MySQL数据库读写分离。 以下是实现数据库读写分离的完整攻略: 1. 安装和配置MySQL主从服务器 确保安装和配置了MySQL主从服务器,并确保主服务器和从服务器之间已正确配置了“主从同步”。可以考虑使用软件程序如MyS…

    Java 2023年6月1日
    00
  • java 中函数的参数传递详细介绍

    Java 中函数的参数传递详细介绍 在 Java 中,函数参数的传递方式有两种,分别是值传递和引用传递。本文将详细介绍这两种传递方式,并给出两个示例说明。 值传递 值传递是指,在调用函数时,将实参的值复制一份传递给形参。这意味着,在函数中对形参的修改不会影响实参。示例如下: public class ValuePassing { public static …

    Java 2023年5月26日
    00
  • 基于Spring + Spring MVC + Mybatis 高性能web构建实例详解

    基于Spring + Spring MVC + Mybatis 高性能web构建实例详解 简介 Spring + Spring MVC + Mybatis是一种常用的Java Web开发框架组合,它们分别负责业务逻辑、Web层和数据访问层。本文将介绍如何使用这三个框架构建高性能的Web应用程序。 环境搭建 在开始之前,我们需要先搭建好开发环境。以下是环境搭建…

    Java 2023年5月17日
    00
  • Maven的安装配置详解

    Maven的安装配置详解 Maven是一种项目管理工具,它可以自动化构建过程并管理项目的依赖关系。Maven使用XML描述项目,使用“pom.xml”文件配置项目的基本信息、依赖以及构建方式。 本文将详细讲解Maven的安装和配置步骤。 安装Maven 访问Maven官网https://maven.apache.org/,下载最新的Maven版本(目前是3.…

    Java 2023年6月2日
    00
  • IDEA-Maven环境配置及使用教程

    关于「IDEA-Maven环境配置及使用教程」,我可以提供以下攻略和演示示例。 Maven的安装 在开始前,我们需要先安装Maven。Maven是一个Java应用程序构建管理工具,所以确保你已经在运行Maven的操作系统上安装了Java。 首先,下载Maven并解压。 然后,将Maven的bin目录添加到系统环境变量PATH中。此时在终端命令行中输入mvn …

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