当前位置: 首页 > news >正文

邮政编码,格式校验:@ZipCode(自定义注解)

目标

自定义一个用于校验邮政编码格式的注解@ZipCode,能够和现有的 Validation 兼容,使用方式和其他校验注解保持一致(使用 @Valid 注解接口参数)。

校验逻辑

有效格式

  1. 不能包含空格;
  2. 应为6位数字;

不校验非空

邮政编码,校验的是格式;不校验是否为空(null 或 空字符串)。如果邮政编码为空,直接通过校验;

核心代码

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

注解:@ZipCode

package com.example.core.validation.zipcode;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;/*** 邮政编码。字符串必须是格式正确的邮政编码。正确格式为:6位数字。* <p>* {@code null} 或 空字符串,是有效的(能够通过校验)。* <p>* 支持的类型:字符串** @author songguanxun* @since 1.0*/
@Target({FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = ZipCodeValidator.class)
public @interface ZipCode {/*** @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 {};}

校验器:ZipCodeValidator

package com.example.core.validation.zipcode;import com.example.core.constant.PatternConstant;
import org.springframework.util.ObjectUtils;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;/*** 邮政编码格式校验器*/
public class ZipCodeValidator implements ConstraintValidator<ZipCode, String> {@Overridepublic void initialize(ZipCode constraintAnnotation) {ConstraintValidator.super.initialize(constraintAnnotation);}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if (ObjectUtils.isEmpty(value)) {return true;}if (value.contains(" ")) {resetMessage(context, "邮政编码,格式错误:不能包含空格");return false;}if (!isValid(value)) {resetMessage(context, "邮政编码,格式错误");return false;}return true;}// 格式为:6位数字private static final Pattern PATTERN = Pattern.compile(PatternConstant.ZIP_CODE);/*** 是有效的格式*/private boolean isValid(CharSequence input) {return PATTERN.matcher(input).matches();}/*** 重置提示信息*/private void resetMessage(ConstraintValidatorContext context, String messageTemplate) {context.disableDefaultConstraintViolation();context.buildConstraintViolationWithTemplate(messageTemplate).addConstraintViolation();}}

用到的常量

package com.example.core.constant;/*** 模式-常量*/
public class PatternConstant {/*** 全部为数字*/public static final String NUMBERS = "^\\d*$";/*** 邮政编码:6位数字*/public static final String ZIP_CODE = "^\\d{6}$";
}

使用

@ZipCode 放在需要校验格式的 邮政编码 字段上。

新增用户Param

package com.example.web.response.model.param;import com.example.core.constant.PatternConstant;
import com.example.core.validation.zipcode.ZipCode;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;@Schema(name = "新增用户Param")
public class UserAddParam {// 其他字段@ZipCode@Schema(description = "邮政编码", example = "201100", pattern = PatternConstant.ZIP_CODE)private String zipCode;}

校验效果

包含空格

在这里插入图片描述

不是6位数字

数字超过6位
在这里插入图片描述

包含非数字的字符
在这里插入图片描述

相关文章:

邮政编码,格式校验:@ZipCode(自定义注解)

目标 自定义一个用于校验邮政编码格式的注解ZipCode&#xff0c;能够和现有的 Validation 兼容&#xff0c;使用方式和其他校验注解保持一致&#xff08;使用 Valid 注解接口参数&#xff09;。 校验逻辑 有效格式 不能包含空格&#xff1b;应为6位数字&#xff1b; 不校验…...

Appium自动化测试框架:关键字驱动+数据驱动

1. 关键字驱动框架简介 原理及特点 关键字驱动测试是数据驱动测试的一种改进类型&#xff0c;它也被称为表格驱动测试或者基于动作字的测试。主要关键字包括三类&#xff1a;被操作对象&#xff08;Item&#xff09;、操作行为&#xff08;Operation&#xff09;和操作值&…...

简单多状态dp【动态规划】

目录 一、按摩师 二、打家劫舍 三、删除并获得点数 四、粉刷房子 五、买卖股票的最佳时机 六、买卖股票的最佳时机&#xff08;含手续费&#xff09; 七、买卖股票的最佳时机III 八、买卖股票的最佳时机IV 一、按摩师 class Solution { public:int massage(vector<int>…...

OpenCV中initUndistortRectifyMap ()函数与十四讲中去畸变公式的区别探究

文章目录 1.十四讲中的去畸变公式2. OpenCV中的去畸变公式3. 4个参数和8个参数之间的区别4.initUndistortRectifyMap()函数源码 最近在使用OpenCV对鱼眼相机图像去畸变时发现一个问题&#xff0c;基于针孔模型去畸变时所使用的参数和之前十四讲以及视觉SLAM中的畸变系数有一点不…...

【C++】C++11——智能指针、内存泄漏、智能指针的使用和原理、RAII、auto_ptr、unique_ptr、shared_ptr、weak_ptr

文章目录 C117.智能指针7.1内存泄漏7.2智能指针的概念7.3智能指针的使用7.3.1 auto_ptr7.3.2 unique_ptr7.3.3 shared_ptr7.3.4 weak_ptr C11 7.智能指针 7.1内存泄漏 什么是内存泄漏&#xff1a; 内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏…...

EDUSRC-记某擎未授权与sql注入

目录 360天擎 - 未授权与sql注入 信息收集 FOFA语法 鹰图搜索 360天擎未授权访问 - 数据库信息泄露 漏洞复现 修复方案 360天擎终端安全管理系统ccid处SQL注入 漏洞复现 手动测试方法 修复方案 360天擎 - 未授权与sql注入 通常访问的页面如下&#xff0c;存在登录框…...

1688拍立淘API接口分享

拍立淘接口&#xff0c;顾名思义&#xff0c;就是通过图片搜索到相关商品列表。通过此接口&#xff0c;可以实现图片搜索爆款商品等功能。 接口地址&#xff1a;1688.item_search_img 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&…...

昇腾910使用记录

一. 压缩文件和解压文件 1. 压缩文件 tar -czvf UNITE-main.tar.gz ./UNITE-main/2. 解压文件 tar -xvf ./UNITE-main/二. CUDA更改为NPU data[label] data[label].cuda() data[instance] data[instance].cuda() data[image] data[image].cuda()更改为 data[label] da…...

从一部iPhone手机看芯片的分类

目录 问题 iPhone X 手机处理器&#xff1a;A11 iPhone X 的两大存储芯片 数字 IC CPU&#xff1a;计算设备的运算核心和控制核心 GPU&#xff1a;图形处理器 ASIC&#xff1a;为解决特定应用问题而定制设计的集成电路 存储芯片&#xff1a;DRAM 和 NAND Flash iPhone…...

arm day 7

完成字符串收发函数的封装并且验证现象&#xff0c;一个字符串发送接受后会有‘\n’ \r src/uart.c #include"uart.h"void uart4_init() {//设置UART4的RCc时钟使能//RCC_MP_APB1ENSETR[16]->1RCC->MP_APB1ENSETR | (0x1<<16);//设置GPIOB和GPIOG的时钟…...

Java基础面试-面向对象

什么是面向对象&#xff1f; 对比面向过程&#xff0c;是两种不同的处理问题角度 面向过程更注重事情的每一个步骤及顺序&#xff0c;面向对象更注重事情有哪些参与者&#xff08;对象&#xff09;&#xff0c;及各自需要做什么 比如洗衣机洗衣服 面向过程会将任务拆解成一系…...

GCC vs. G++:C 与 C++ 编译器的差异和比较

本文将介绍 GCC&#xff08;GNU Compiler Collection&#xff09;和 G 编译器的区别&#xff0c;并对它们在 C 和 C 程序开发中的特性和用法进行比较和总结。 引言 在 C 和 C 程序开发中&#xff0c;选择合适的编译器是至关重要的。GCC&#xff08;GNU Compiler Collection&a…...

MAC m系列docker login报错

错误&#xff1a;ERROR: failed to solve: XXX error getting credentials - err: exit status 1, out: 解决&#xff1a; vi ~/.docker/config.jsonzsxzsx [15时55分55秒] [~] { {"auths": {"harbor-g42c.corp.matrx.team": {"auth": "…...

Redis通用指令和五大基本数据类型常用指令总结

通用指令 keys parttern 查询key (parttern即通配符&#xff0c;不是正则表达式&#xff0c;例如 keys a? 匹配以a开头的长度为2的key) del key 删除key exists key 获取key是否存在 type key 获取key的类型 expire key seconds 为指定key设置有效期&#xff0c;单位秒 …...

uCharts常用图表组件demo

带渐变阴影的曲线图 <view class"charts-box"><qiun-data-charts type"area" :opts"opts" :chartData"chartData" :ontouch"true":background"rgba(256,256,256,0)" /> </view>data(){return{…...

VNC:Timed out waiting for a response from the computer

VNC的服务端使用的是TigerVNC&#xff0c;客户端使用的是RealVNC TigerVNC按其他博客配好后&#xff0c;防火墙ip什么的都配了&#xff0c;vnc客户端怎么连都是超时。 这里建议大家可以尝试一下重启服务器。我的是CentOS的 shutdown -r now 配了2天&#xff0c;最后服务器重启…...

Kotlin 协程 知识点

Android 上的 Kotlin 协程 | Android Developers (google.cn) 官方网址 1.什么是协程&#xff1f; 我觉得协程就是kotlin中一种优雅的实现异步请求 协程&#xff08;Coroutines&#xff09;是一种轻量级的并发编程概念&#xff0c;旨在简化异步编程和并发任务的处理。它是…...

简单大方的自我介绍 PPT 格式

自我介绍是展示自己的机会&#xff0c;同时也是展现自信和魅力的重要时刻。通过简单大方的PPT格式&#xff0c;可以更好地展示自己的个性和才华。下面是一些建议&#xff0c;帮助你在自我介绍中展现自信和魅力。 1. 打造简洁而有吸引力的PPT布局&#xff1a; - 选择简洁大方的背…...

panads操作excel

panads简介 pandas是基于Numpy创建的Python包&#xff0c;内置了大量标准函数&#xff0c;能够高效地解决数据分析数据处理和分析任务&#xff0c;pandas支持多种文件的操作&#xff0c;比如Excel&#xff0c;csv&#xff0c;json&#xff0c;txt 文件等&#xff0c;读取文件之…...

【MySQL】联合查询、子查询、合并查询

这里提供了三个表&#xff1a; 表1&#xff1a; mysql> select * from class; -------------- | id | name | -------------- | 1 | 一班 | | 2 | 二班 | | 3 | 三班 | -------------- 3 rows in set (0.01 sec) 表2&#xff1a; mysql> select * fro…...

2026最权威的六大降重复率工具解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 飞速发展的人工智能技术&#xff0c;正深切地重塑着学术写作的范式&#xff0c;当下&#xf…...

别再混淆了!一文讲透NvDecoder里ulNumDecodeSurfaces和ulNumOutputSurfaces到底怎么用

深入解析NvDecoder&#xff1a;解码缓存与输出缓存的本质区别与实战配置 在视频处理领域&#xff0c;NVIDIA的硬件解码器&#xff08;NVDEC&#xff09;因其出色的性能和高效的资源利用率而广受开发者青睐。然而&#xff0c;对于许多中高级开发者来说&#xff0c;NvDecoder中ul…...

Livox Mid360激光雷达动态避障实战:DWA算法在移动机器人中的应用

1. Livox Mid360激光雷达与DWA算法初探 第一次接触Livox Mid360这款固态激光雷达时&#xff0c;我就被它的性能惊艳到了。相比传统机械式雷达&#xff0c;Mid360不仅体积小巧&#xff0c;而且扫描频率高达100Hz&#xff0c;特别适合用在移动机器人上做实时避障。记得去年给一个…...

VCS编译SystemVerilog时,那个‘-P’选项你加对了吗?详解Verdi PLI配置

VCS编译SystemVerilog时&#xff0c;那个‘-P’选项你加对了吗&#xff1f;详解Verdi PLI配置 在芯片验证的日常工作中&#xff0c;VCSVerdi的组合堪称黄金搭档。但当你满怀信心地敲下编译命令&#xff0c;却发现怎么也生成不了关键的fsdb波形文件时&#xff0c;那种挫败感简直…...

uboot移植实战:DDR初始化参数优化与调试指南

1. 理解DDR初始化在uboot移植中的重要性 第一次接触uboot移植时&#xff0c;我完全不明白为什么DDR初始化这么麻烦。直到有一次&#xff0c;我把开发板直接烧成砖头&#xff0c;才真正意识到这个环节有多关键。简单来说&#xff0c;DDR初始化就像是给电脑装内存条&#xff0c;但…...

告别远程服务器:在Ubuntu 22.04上为ARM64嵌入式开发搭建本地sysroot环境(保姆级教程)

告别远程服务器&#xff1a;在Ubuntu 22.04上为ARM64嵌入式开发搭建本地sysroot环境&#xff08;保姆级教程&#xff09; 嵌入式开发者常面临一个尴尬困境&#xff1a;每次修改代码后&#xff0c;都需要将代码上传到远程ARM服务器或开发板进行编译测试&#xff0c;不仅耗时耗力…...

W25Q128JWSIQ 串行 NOR Flash 存储器 Winbond 全新原装 进口芯片IC

W25Q128JWSIQ 是华邦&#xff08;Winbond&#xff09;推出的一款1.8V 128Mbit 高速串行 NOR Flash 存储器&#xff0c;采用 133MHz 四线 SPI 接口和 SOIC-8 封装&#xff0c;具备超低功耗、工业级宽温工作范围和高可靠性等特性&#xff0c;是物联网设备、汽车电子、工业控制等低…...

Delphi网络编程实战:UDP通信与多线程网络优化详解

前两篇文章分别讲解了Delphi中基于Indy组件的TCP点对点通信、HTTP/HTTPS接口交互&#xff0c;覆盖了可靠连接、Web对接两大常用场景。本篇将深入讲解UDP通信&#xff0c;同时补充多线程网络编程、数据传输防护、常见故障排查等进阶内容&#xff0c;补齐Delphi网络开发的核心模块…...

网页资源提取工具:猫抓开源方案解决媒体获取难题

网页资源提取工具&#xff1a;猫抓开源方案解决媒体获取难题 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化学习与研究的过程中&#xff…...

MGeo中文地址解析模型入门指南:地址要素边界识别难点与MOMETAS多任务缓解策略

MGeo中文地址解析模型入门指南&#xff1a;地址要素边界识别难点与MOMETAS多任务缓解策略 地址&#xff0c;这个我们日常生活中再熟悉不过的信息&#xff0c;背后却隐藏着巨大的技术挑战。你有没有想过&#xff0c;当你在地图App里输入“北京市海淀区中关村大街27号”&#xf…...