java自定义验证器的实现示例

 更新时间:2024年01月18日 08:26:43   作者:飞起的豹子  
在对外暴露接口中,我们通常会对入参进行验证,比如一些字符串非空判断等,本文主要介绍了java自定义验证器的实现示例,具有一定的参考价值,感兴趣的可以了解一下

前言

在对外暴露接口中,我们通常会对入参进行验证,比如一些字符串非空判断、数字最小值最大值这些基础的判断在java验证规范中已经提供了,然而这些只是常规的验证,我们可以通过自定义注解以及验证器来进行我们自己业务上的一些验证,这样可以避免在业务逻辑中添加过多的验证,降低代码的可读性。

使用

1、依赖引入

仅需引入验证包即可,当然,如果使用的springboot,可以直接管理依赖,不用指定版本

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>

2、自定义注解

这里添加一个银行卡验证的注解,其实核心注解就是@Constraint,这个注解要求我们的注解中必须有message()groups()以及payload()这三个方法

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * 银行卡号校验注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
// 这里指定验证器
@Constraint(validatedBy = {BankCardValidator.class})
@Target({ElementType.FIELD,ElementType.ANNOTATION_TYPE,ElementType.PARAMETER})
public @interface BankCardValidity {

    /**
     * 提示信息
     * @return String
     */
    String message() default "";

    /**
     * 是否验证
     * @return boolean
     */
    boolean required() default true;

    /**
     * groups
     * @return []
     */
    Class<?>[] groups() default {};


    /**
     * payload
     * @return []
     */
    Class<? extends Payload>[] payload() default {};
}

3、编写验证器

验证器的核心是实现ConstraintValidator这个类,第一个参数是指定注解,第二个则是指定的入参

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 银行卡号校验器
 */
public class BankCardValidator implements ConstraintValidator<BankCardValidity,String> {

    /**
     * 是否强制验证
     */
    private boolean required = false;

    /**
     * 银行卡号正则校验,这里就是一个正则验证
     */
    private static Pattern patternForBankCardNo = Pattern.compile("^([1-9]{1})(\\d{15}|\\d{18})$");
	
	/**
	 * 这里就是验证逻辑,返回true验证通过,返回false验证不通过
	 */
    @Override
    public boolean isValid(String bankCardNo, ConstraintValidatorContext context) {
        if (required) {
            return isBankCardNo(bankCardNo);
        } else {
            if (StrUtil.isBlank(bankCardNo)) {
                return false;
            }
            return isBankCardNo(bankCardNo);
        }
    }

    @Override
    public void initialize(BankCardValidity validity) {
        required = validity.required();
    }

    /**
     * 验证是否为银行卡号
     * @param bankCardNo 输入内容
     * @return boolean
     */
    private static boolean isBankCardNo(String bankCardNo) {
        // 使用的hutool工具包,也可以使用其它工具包
        if (StrUtil.isBlank(bankCardNo)) {
            return false;
        }
        Matcher matcherForBankCardNo = patternForBankCardNo.matcher(bankCardNo);
        return matcherForBankCardNo.matches() ;
    }
}

至此编码就完成了,我们可以在注解中添加新的方法,在initialize()方法中使用,或者取值等操作,这都是根据业务场景来进行的。
当然,在入参校检中,我们肯定也需要把@Valid等注解加上,验证器才会去验证。

到此这篇关于java自定义验证器的实现示例的文章就介绍到这了,更多相关java自定义验证器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java String类常量池分析及

    java String类常量池分析及"equals"和"==”区别详细介绍

    这篇文章主要介绍了java String类常量池分析及"equals"和"==”区别详细介绍的相关资料,需要的朋友可以参考下
    2016-12-12
  • Java利用ElasticSearch实现自动补全功能

    Java利用ElasticSearch实现自动补全功能

    这篇文章主要为大家详细介绍了Java如何利用ElasticSearch实现跟谷歌和百度类似的下拉补全提示功能,文中的示例代码讲解详细,需要的可以参考一下
    2023-08-08
  • Java网络编程之入门篇

    Java网络编程之入门篇

    这篇文章主要介绍了Java网络编程入门,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java实现度分秒坐标转十进制度

    Java实现度分秒坐标转十进制度

    随着技术的发展,十进制度因其精确性和便捷性在现代应用中越来越受到青睐,下面我们就来看看如何使用Java实现度分秒坐标转十进制度吧
    2024-12-12
  • java bootclasspath的具体用法

    java bootclasspath的具体用法

    本文主要介绍了java bootclasspath的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • springboot使用Thymeleaf报错常见的几种解决方案

    springboot使用Thymeleaf报错常见的几种解决方案

    这篇文章主要介绍了springboot使用Thymeleaf报错常见的几种解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • SpringBoot3和mybatis-plus整合出现的问题解决办法

    SpringBoot3和mybatis-plus整合出现的问题解决办法

    SpringBoot和MybatisPlus的整合可以让我们更加方便地进行数据库操作,这篇文章主要给大家介绍了关于SpringBoot3和mybatisplus整合出现的一些问题的相关资料,需要的朋友可以参考下
    2024-01-01
  • Java面向对象基础知识之抽象类和接口

    Java面向对象基础知识之抽象类和接口

    这篇文章主要介绍了Java面向对象的抽象类和接口,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-11-11
  • 通过IEAD+Maven快速搭建SSM项目的过程(Spring + Spring MVC + Mybatis)

    通过IEAD+Maven快速搭建SSM项目的过程(Spring + Spring MVC + Mybatis)

    这篇文章主要介绍了通过IEAD+Maven快速搭建SSM项目的过程(Spring + Spring MVC + Mybatis),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • java中Unsafe的使用讲解

    java中Unsafe的使用讲解

    这篇文章主要介绍了java中Unsafe的使用讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论