手机号码,格式校验:@PhoneQuery(作为查询参数)(自定义注解)

news2024/12/23 22:51:03

目标

自定义一个用于校验(作为查询参数的)手机号码格式的注解@PhoneQuery,能够和现有的 Validation 兼容,使用方式和其他校验注解保持一致。

校验逻辑

  1. 可以为 null空字符串
  2. 不能包含空格
  3. 必须为数字序列(全部为数字);
  4. 长度应小于等于11位;

核心代码

需要定义的内容包含两个部分:注解@PhoneQuery 和 校验器PhoneQueryValidator

注解:@PhoneQuery

package com.example.core.validation.phone.query;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 字符串必须是格式正确的手机号码,或手机号码的一部分。正确格式为:小于等于11位的数字。
 * <p>
 * {@code null} 或 空字符串,是有效的(能够通过校验)。
 * <p>
 * 支持的类型:字符串
 *
 * @author songguanxun
 * @since 1.0
 */
@Target({FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = PhoneQueryValidator.class)
public @interface PhoneQuery {

    /**
     * @return the error message template
     */
    String message() default "手机号码,格式错误";

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

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

    /**
     * 手机号码的详细描述。
     * <p>
     * 用于用户提示中,当页面中存在多个手机号码时,帮助用户更好的区分是哪个手机号码填错了。
     */
    String description() default "手机号码";
}

校验器:PhoneQueryValidator

package com.example.core.validation.phone.query;

import org.springframework.util.ObjectUtils;

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

/**
 * 手机号码(查询参数)格式校验器
 */
public class PhoneQueryValidator implements ConstraintValidator<PhoneQuery, String> {

    // 手机号码的详细描述。
    private String description;


    @Override
    public void initialize(PhoneQuery constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
        description = constraintAnnotation.description();
    }


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

        if (value.contains(" ")) {
            String message = String.format("%s,格式错误:不能包含空格", description);
            resetMessage(context, message);
            return false;
        }

        if (!isNumericSequence(value)) {
            String message = String.format("%s,格式错误:必须为数字序列", description);
            resetMessage(context, message);
            return false;
        }

        if (value.length() > 11) {
            String message = String.format("%s,格式错误:长度应小于等于11位", description);
            resetMessage(context, message);
            return false;
        }

        return true;
    }


    // 格式:数字序列(全部为数字)
    private static final Pattern PATTERN_NUMERIC_SEQUENCE = Pattern.compile("^\\d*$");


    /**
     * 是数字序列
     */
    private boolean isNumericSequence(CharSequence input) {
        return PATTERN_NUMERIC_SEQUENCE.matcher(input).matches();
    }


    /**
     * 重置提示信息
     */
    private void resetMessage(ConstraintValidatorContext context, String messageTemplate) {
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(messageTemplate).addConstraintViolation();
    }

}

使用

@PhoneQuery 放在需要校验格式的 用作查询条件的手机号码 字段上。

package com.example.web.exception.query;

import com.example.core.validation.phone.query.PhoneQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springdoc.api.annotations.ParameterObject;

@Data
@ParameterObject
@Schema(name = "用户Query")
public class UserQuery {

    @Schema(description = "姓名", example = "张三")
    private String name;

    @PhoneQuery
    @Schema(description = "手机号码", example = "18612345678", pattern = "^\\d*$", maxLength = 11)
    private String phone;

}

校验效果

1. 可以为 null 或 空字符串

在这里插入图片描述

2. 不能包含空格

在这里插入图片描述

3. 必须为数字序列(全部为数字)

在这里插入图片描述

4. 长度应小于等于11位

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1060347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络安全-信息收集】网络安全之信息收集和信息收集工具讲解

一&#xff0c;域名信息收集 1-1 域名信息查询 可以用一些在线网站进行收集&#xff0c;比如站长之家 域名Whois查询 - 站长之家站长之家-站长工具提供whois查询工具&#xff0c;汉化版的域名whois查询工具。https://whois.chinaz.com/ 可以查看一下有没有有用的信息&#xf…

NPDP产品经理知识(产品设计与开发工具)

1.复习产品创新流程 -- 系统工程 -- 设计思维&#xff08;DESIGN THINKING&#xff09; -- 精益创业&#xff08;LEAN STARTUP&#xff09; 精益创业关键要素&#xff1a;BML -- 产品创新流程模型的比较&#xff1a; 2.产品设计与开发工具 2-1 创意生成阶段&#xff1a…

物流项目学习总结(在更)

物流项目的分类 技术架构图&#xff08;面试时面试官会要求你画出技术架构图&#xff09; 功能结构图 业务功能流程 流程说明&#xff1a; 用户在【用户端】下单后&#xff0c;生成订单 系统会根据订单生成【取件任务】&#xff0c;快递员上门取件后成功后生成【运单】 用户对…

【项目开发 | C语言项目 | C语言病人管理系统】

该项目旨在为医院或其他医疗机构提供一个简易的病人信息管理工具。用户可以通过命令行界面进行病人信息的增、删、查和改操作&#xff0c;并将数据持久化存储在txt文件中。 一&#xff0c;开发环境需求 操作系统 &#xff1a;Windows, Linux 开发环境工具 &#xff1a;Qt, VSC…

什么是数字资产?(修订精编版)

修订说明 整整三年前&#xff0c;2020 年 10 月 7 日&#xff0c;我在本公众号里发表了《什么是数字资产&#xff1f;》一文。这篇文章是我们三位作者长达两个月思考的结果&#xff0c;也可以说是 Solv 创新旅程的起点。这篇文章通过对比数字世界与现实世界里的凭证类型&#x…

[论文工具] LaTeX常见错误及解决方法汇总笔记(eps2pdf失败 | 特殊符号 | 参考文献未显示或越界)

祝大家中秋国庆双节快乐&#xff01; 回过头来&#xff0c;我们在编程过程中&#xff0c;经常会遇到各种各样的问题。然而&#xff0c;很多问题都无法解决&#xff0c;网上夹杂着各种冗余的回答&#xff0c;甚至需要看自己多年前的博客来解决。为更好地从事科学研究和编程学习&…

免费服务器搭建网盘教程,给电脑挂载500G磁盘

免费服务器搭建网盘教程&#xff0c;给电脑挂载500G磁盘 请勿注册下载&#xff0c;注册下载是空白文件&#xff0c;使用免登录下载 免费搭建网盘教程&#xff0c;给电脑挂载500G磁盘 其他按照下载教程操作教程代码: 下载下来的文件pancn 文件拖到您创建的容器 手机的话点击…

linux内核分析:网络协议栈

从本质上来讲,所谓的建立连接,其实是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,并用这样的数据结构来保证面向连接的特性。TCP 无法左右中间的任何通路,也没有什么虚拟的连接,中间的通路根本意识不到两端使用了 TCP 还是 UDP。 所谓的连接…

触摸屏驱动

驱动框架 多点电容触摸芯片的接口&#xff0c;一般都为 I2C 接口&#xff0c;因此驱动主框架肯定是 I2C。 当设备树中触摸 IC的设备节点和驱动匹配以后 。进入probe入口函数。在此函数中初始化触摸 IC&#xff0c;中断和 input 子系统等 linux 里面一般都是通过中断来上报触…

PTrade获取交易日期——时间相关函数1

本系列文章将笔者平时在使用ptrade进行策略开发中使用到的与日期相关的函数进行记录&#xff0c;以便大家参考并一同改进优化。 如果读者还有其他日期相关的函数实现需求&#xff0c;也可以留言&#xff0c;大家一起讨论补充。 首先看一下ptrade提供的get_trading_day函数的用…

vivado杂项记录

文章目录 问题的解决Xilinx Vitis 启动时未响应的解决方法Spawn failed&#xff1a;No error错误vivado卡在Initializing Language Server的解决方法vivado中添加文件后出现non-module 其他关于MAX_FANOUT属性vviado 2018.3中IP的core container 问题的解决 Xilinx Vitis 启动…

typescript 分析泛型工具类Partial的实现原理理解索引查询类型

Partial实现原理 在 TypeScript 中&#xff0c;Partial 是一个非常有用的工具类型&#xff0c;它能够将一个对象类型的所有属性变为可选。Partial 的实现原理是通过使用映射类型&#xff08;Mapped Type&#xff09;和 keyof 关键字来实现的。 下面我们来看一下 Partial 的实现…

System Generator初体验FIR滤波器

文章目录 前言一、介绍1、目标2、过程 二、步骤 1&#xff1a;在 FPGA 中创建设计1、打开 Lab1_1.slx 文件2、运行仿真3、使用 System Generator 创建 FIR 滤波器<1>、从库浏览器寻找需要的模块<2>、配置系统生成器块<3>、在 FPGA 上实现设计 三、步骤 2&…

第一章 函数 极限 连续(解题方法须背诵)

&#xff08;一&#xff09;求极限的常用方法 方法1 利用有理运算法则求极限 方法2 利用基本极限求极限 方法3 利用等价无穷小求极限 方法4 利用洛必达法则求极限 方法5 利用泰勒公式求极限 方法6 利用夹逼准则求极限 方法7 利用定积分的定义求极限 方法8 利用单调有界…

JMeter界面和字体的调整

一、界面直接调整 二、调整界面比例&#xff08;分辨率&#xff09; jmeter.hidpi.modetrue jmeter.hidpi.scale.factor2.0用记事本打开 将如下代码中的第一行和第五行的注释去掉即可 #jmeter.hidpi.modetrue # HiDPI scale factor #jmeter.hidpi.scale.factor1.0 # Suggeste…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第三周测验

课程1_第3周_测验题 目录&#xff1a;目录 第一题 1.以下哪一项是正确的&#xff1f; A. 【  】 a [ 2 ] ( 12 ) a^{[2](12)} a[2](12)是第12层&#xff0c;第2个训练数据的激活向量。 B. 【  】X是一个矩阵&#xff0c;其中每个列都是一个训练示例。 C. 【  】 a 4 […

互联网Java工程师面试题·MyBatis 篇·第一弹

目录 1、什么是 Mybatis&#xff1f; 2、Mybaits 的优点 3、MyBatis 框架的缺点 4、MyBatis 框架适用场合 5、MyBatis 与 Hibernate 有哪些不同&#xff1f; 6、#{}和${}的区别是什么&#xff1f; 7、当实体类中的属性名和表中的字段名不一样 &#xff0c;怎么办 &#x…

ERROR 6400 --- [ main] com.zaxxer.hikari.pool.HikariPool : root - Exception

在引用的日志中&#xff0c;报告了Hikari连接池初始化期间的异常。具体异常信息是"Exception during pool initialization"。这个异常可能是由于与MySQL数据库的通信链接失败导致的。在引用中也提到了与SSL连接相关的错误。 根据引用中提供的代码&#xff0c;可以看到…

docker方式启动一个java项目-Nginx本地有代码,并配置反向代理

文章目录 案例导入说明1.安装MySQL1.1.准备目录1.2.运行命令1.3.修改配置1.4.重启 2.导入SQL3.导入Demo工程3.1.分页查询商品&#xff08;仔细看代码&#xff0c;很多新的MP编程技巧&#xff09;3.2.新增商品3.3.修改商品3.4.修改库存3.5.删除商品3.6.根据id查询商品3.7.根据id…

html 高性能 简易轮播图

目标 实现简易轮播图动画效果 设计理念 无论有多少个轮播图&#xff0c;仅使用常数个轮播图tab&#xff0c;通过js替换更新dom内容&#xff0c;实现性能优化&#xff1b;使用bfc避免回流&#xff0c;&#xff08;重绘是基本上无法避免&#xff0c;不在考虑&#xff09;&#…