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

yizhihongxing

根据您的需求,我会详细讲解 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中使用jpa下hibernate的ddl-auto方式

    下面是使用JPA下Hibernate的ddl-auto方式在Spring Boot中的完整攻略。 1. 配置JPA数据源 在使用JPA下Hibernate的ddl-auto方式之前,我们需要先配置JPA的数据源。例如,我们可以使用application.properties文件来配置JPA数据源,方法如下: spring.datasource.url=jdb…

    Java 2023年5月20日
    00
  • 深入Java Final

    深入Java Final的完整攻略 什么是Java Final Java Final关键字表示某个实体不可更改,这个实体可能是变量、方法或类。 当我们将一个变量声明为final时,它表示该变量只能被赋值一次,一旦被赋值就不能再改变。相应地,当我们将一个方法声明为final时,它表示该方法不能再被子类重写。最后,当我们将一个类声明为final时,它表示该类不能…

    Java 2023年5月26日
    00
  • 浅谈Spring Boot日志框架实践

    浅谈SpringBoot日志框架实践 在Spring Boot应用程序中,日志是一项非常重要的功能。通过日志,我们可以记录应用程序的运行状态,帮助我们快速定位和解决问题。本文将手把手教你如何在Spring Boot应用程序中使用日志框架,包括选择日志框架、配置日志框架、使用日志框架等。 1. 选择日志框架 在Spring Boot中,我们可以选择多种日志框架…

    Java 2023年5月14日
    00
  • JSP 中response.setContentType()的作用及参数

    在 JSP 程序中,response.setContentType() 方法可以设置响应的MIME类型,MIME 类型全称是 Multipurpose Internet Mail Extensions,意为多用途互联网邮件扩展类型,它是一种标准,用来表示文档在网络传输中的格式,例如 HTML 页面可以使用 text/html,JPG 图片可以使用 image…

    Java 2023年6月15日
    00
  • 使用IDEA配置tomcat及创建JSP文件的方法

    下面是详细的步骤以及示例说明。 配置Tomcat 下载Tomcat:首先需要从官网下载Tomcat的压缩包,选择对应的版本并下载。 解压Tomcat:下载完成后,解压压缩包至一个合适的目录下,比如 /usr/local/tomcat。 配置Tomcat的环境变量:在终端中输入以下命令来进行环境变量的配置。 shell export CATALINA_HOME…

    Java 2023年6月15日
    00
  • 常见的对象引用有哪些?

    关于“常见的对象引用有哪些”这个问题,下面我将为大家提供一份完整的使用攻略,具体步骤如下: 第一步:理解对象引用的含义 对象引用,是指在 Java 中,存储在变量中的引用,指向在内存中分配的实际的对象。变量只存储引用,而不存储实际的对象。因此,Java 中的对象引用是一种非常重要的概念。 第二步:了解常见的对象引用 Java 中常见的对象引用有以下四种: 强…

    Java 2023年5月11日
    00
  • java导出json格式文件的示例代码

    下面是“Java导出JSON格式文件的示例代码”的完整攻略。 1. 简介 在Java程序设计中,我们常常需要将数据导出为JSON格式的文件。JSON格式文件可以被用于数据的持久化、传输和共享等场景。本篇攻略将介绍Java导出JSON格式文件的基本实现方法,并提供两条示例代码供您参考。 2. Jackson库的介绍 在Java中,Jackson是一个流行的JS…

    Java 2023年5月20日
    00
  • Java I/O 操作及优化详细介绍

    Java I/O 操作及优化详细介绍 Java 中的 I/O 操作可以通过 InputStream、OutputStream、Reader、Writer 等类实现,在进行 I/O 操作的同时,我们需要注意一些优化策略。 1. InputStream 和 OutputStream 在 Java 中,I/O 操作使用 InputStream 和 OutputSt…

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