SpringBoot 如何自定义请求参数校验

根据您的需求,我会详细讲解 SpringBoot 如何自定义请求参数校验的完整攻略。

1. 简介

SpringBoot默认使用 Hibernate Validator 作为参数校验的实现库(底层实现其实是 JSR-303 Bean Validation 规范)。在进行参数校验时,我们通常会使用一组预定义好的注解,如:@NotNull、@Min、@Max、@Size、@DecimalMin、@DecimalMax 等来辅助完成校验。但是有一些场景,我们需要将检验规则进行个性化的配置,比如配置字段校验规则、自定义校验注解等。

2. 前置条件

在开始本文,需要先确保您已经具备以下条件:

  • JDK 8 或更高版本
  • SpringBoot 2.x 或更高版本

3. 自定义参数校验器

3.1 实现 ConstraintValidator 接口

自定义参数校验器,需要实现 ConstraintValidator 接口。ConstraintValidator 是一个泛型接口,提供了两个泛型参数,分别代表:

  • 注解类型,也就是我们自定义的参数校验注解(比如:@Phone)
  • 被校验的属性类型(比如:String)
public class PhoneValidator implements ConstraintValidator<Phone, String> {

    private static final String PHONE_PATTERN = "^1([34578])\\d{9}$";
    private static final Pattern pattern = Pattern.compile(PHONE_PATTERN);

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (StringUtils.isEmpty(value)) {
            return true;
        }

        Matcher matcher = pattern.matcher(value);
        return matcher.matches();
    }

    @Override
    public void initialize(Phone constraintAnnotation) {
        // 针对注解进行初始化
    }
}

以上示例中,我们使用了正则表达式匹配手机号。注解 @Phone 的定义如下:

/**
 * 手机号校验注解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {

    String message() default "手机号格式不正确";

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

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

完成自定义参数校验器和注解的定义后,我们就可以将其应用到 SpringMvc 中了。

3.2 应用到 SpringMvc

使用自定义校验注解时,我们需要在使用参数校验注解的 Controller 方法参数前加上注解 @Valid。同时,在要求校验的参数上,需要加上具体的校验注解,如:@NotNull、@NotBlank、@Size、@Phone 等。这样,在接口调用时,Spring 会对参数进行校验。

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

    @PostMapping
    public String createUser(@RequestBody @Valid User user) {
        return "createUser";
    }
}

以上示例中,我们使用 @Phone 校验了用户注册时填写的手机号码。假设用户提供了一个非法的手机号码,接口在执行时会返回以下错误信息:

{
    "timestamp": "2021-01-01T00:00:00.000+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "Invalid Parameter",
    "path": "/users",
    "errors": [
        {
            "field": "phone",
            "message": "手机号格式不正确"
        }
    ]
}

4. 示例代码

下面是一个简单的示例程序,您可以参考其中的代码实现自定义参数校验注解。

/**
 * @Author: GXBB
 * @Date: 2021/1/1 14:18
 * @Version: 1.0
 */
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @RestController
    @RequestMapping("/user")
    public class UserController {

        @PostMapping
        public String createUser(@RequestBody @Valid User user) {
            return "createUser";
        }
    }

    /**
     * 用户实体类
     */
    public static class User {
        @NotBlank(message = "姓名不能为空")
        private String userName;

        @Phone(message = "手机格式不正确")
        private String phone;

        // 省略 getter/setter 方法
    }

    /**
     * 手机号校验注解
     */
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Constraint(validatedBy = PhoneValidator.class)
    public @interface Phone {

        String message() default "手机号格式不正确";

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

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

    /**
     * 手机号校验器
     */
    public static class PhoneValidator implements ConstraintValidator<Phone, String> {

        private static final String PHONE_PATTERN = "^1([34578])\\d{9}$";
        private static final Pattern pattern = Pattern.compile(PHONE_PATTERN);

        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            if (StringUtils.isEmpty(value)) {
                return true;
            }

            Matcher matcher = pattern.matcher(value);
            return matcher.matches();
        }

        @Override
        public void initialize(Phone constraintAnnotation) {
            // 针对注解进行初始化
        }
    }
}

另外,我还给出了一个实现了参数级别自定义校验的示例,可以参考:SpringBoot 参数级别自定义校验示例。这个示例中,我们自定义了一个校验注解 @NotContainSensitiveWords,用于检验用户提供的“内容”字段中是否包含了敏感词。这个示例将更加深入地了解自定义参数校验器的实现方法。

希望这些内容可以帮助您了解 SpringBoot 如何自定义请求参数校验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot 如何自定义请求参数校验 - Python技术站

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

相关文章

  • Springboot详解整合SpringSecurity实现全过程

    下面是Spring Boot整合Spring Security的详细攻略,包含两个示例。 Spring Boot整合Spring Security实现全过程 Spring Security是一个功能强大的安全框架,可以帮助我们实现身份验证、授权、攻击防护等安全功能。在Spring Boot中,可以使用Spring Security提供的集成库来方便地使用Sp…

    Java 2023年5月15日
    00
  • Java中常用的6种排序算法详细分解

    Java中常用的6种排序算法详细分解 在Java中,常用的排序算法主要有六种:冒泡排序、选择排序、插入排序、希尔排序、归并排序和快速排序。下面将详细讲解这六种算法的原理和实现过程。 冒泡排序 冒泡排序是一种简单的排序算法,它的原理是通过重复地遍历要排序的列表,每遍历一次就把相邻的两个元素比较大小并交换位置。具体实现过程如下: public static vo…

    Java 2023年5月19日
    00
  • SpringMVC静态资源配置过程详解

    简介 在SpringMVC应用程序中,静态资源是指不需要动态生成的文件,例如CSS、JavaScript、图片等。在本文中,我们将介绍如何在SpringMVC应用程序中配置静态资源,并提供两个示例说明。 静态资源配置 在SpringMVC应用程序中,我们可以通过以下两种方式来配置静态资源: 使用<mvc:resources>元素配置静态资源。 使…

    Java 2023年5月17日
    00
  • 详解SpringBoot是如何整合SpringDataRedis的?

    首先需要了解Spring Boot和Spring Data Redis的概念: Spring Boot是Spring Framework的一个开源轻量级框架,可用于构建基于Java的Web应用程序,它提供了自动化的配置和快速的应用程序启动能力。 Spring Data Redis是Spring Data家族框架之一,提供了简单的方式与Redis数据库进行集成…

    Java 2023年5月20日
    00
  • IDEA多线程文件下载插件开发的步骤详解

    下面我会为你详细讲解“IDEA多线程文件下载插件开发的步骤详解”的完整攻略。整个过程将包含以下几个步骤: 确定要实现的功能 新建一个IntelliJ IDEA插件项目 编写代码,完成下载文件的功能 安装和调试插件 将插件打包发布 下面对每个步骤进行详细说明: 1. 确定要实现的功能 在开发插件之前,我们需要确定插件要实现的功能和使用场景。本篇攻略实现的功能是…

    Java 2023年5月26日
    00
  • Java中print、printf、println的区别 原创

    Java中print、printf、println的区别 在Java中,我们经常使用print、printf、println这三种输出内容的方法,虽然它们都可以用于输出内容,但是其实它们有着不同的用法和表现形式。 print方法 print方法是Java中最基本的输出方法,它的作用是直接输出内容,不会换行。该方法是以字符串形式输出,可以接受多个参数,参数之间…

    Java 2023年5月26日
    00
  • 浅谈json取值(对象和数组)

    浅谈JSON取值(对象和数组) JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的语法,但是JSON数据可以被其他编程语言解析和生成。JSON的数据结构是一种”键-值”的数据类型集合,类似于JavaScript中的对象,但是JSON没有方法。JSON通过JavaScript中…

    Java 2023年5月26日
    00
  • Spring JPA联表查询之OneToMany源码解析

    OK,这里是详细讲解“Spring JPA联表查询之OneToMany源码解析”的完整攻略。 一、背景介绍 在开发过程中,经常需要使用 JPA 进行数据库操作,其中,面对一对多关系的模型,我们可能需要使用到 JPA 的联表查询功能。本文将以一个简单的例子为基础,深入探究 Spring JPA 如何实现一对多关系的联表查询。 二、实例解析 考虑在一个商城系统中…

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