Javax Validation 自定义注解校验(身份证号校验)

一、场景分析

我们使用 SpringMVC 在 Controller 层,对身份证号进行数据校验的话,经常采用以下方式:

@RestController
@RequiredArgsConstructor
@RequestMapping("member")
public class MemberController {// 身份证号码正则表达式String regex = "^(^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}[0-9Xx]$)$";@PostMapping("/register")public R<Void> register(@RequestBody @Valid Member member) {Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(member.getIdNo());if (!matcher.matches()) {return R.fail("不是有效的身份证号");}System.out.println(member);return R.success();}
}

 我们当然可以采用上面的方式进行数据校验,但这种方式不是很优雅:

如果项目中还有别的对象需要进行身份证号校验,那么同样的代码就会在项目里散落一地。

Javax Validation 提供给我们另一种优雅的方式,进行逻辑重复的数据校验。

二、代码实现

1、创建自定义校验注解

首先创建一个自定义的校验注解,用于校验字符串是否为有效的身份证号格式

package com.study.annotations;import com.study.config.IdCheckValidator;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {IdCheckValidator.class}
)
public @interface IdCheck {String message() default "不是有效的身份证号";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

 2、创建校验器实现类

 创建一个实现 ConstraintValidator 接口的类来实现自定义校验逻辑

package com.study.config;import com.study.annotations.IdCheck;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class IdCheckValidator implements ConstraintValidator<IdCheck, String> {// 身份证号码正则表达式String regex = "^(^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}[0-9Xx]$)$";private Pattern pattern;@Overridepublic void initialize(IdCheck constraintAnnotation) {// 初始化 patternthis.pattern = Pattern.compile(regex);}@Overridepublic boolean isValid(String idNo, ConstraintValidatorContext constraintValidatorContext) {Matcher matcher = pattern.matcher(idNo);return matcher.matches();}
}

 3、在实体类中使用自定义注解

package com.study.member.entity;import com.study.annotations.IdCheck;
import lombok.Data;@Data
public class Member {// 自定义注解@IdCheckprivate String idNo;
}

4、在控制器中进行数据绑定和校验 

package com.study.member.controller;import com.study.memberentity.Member;
import com.study.common.base.R;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;@RestController
@RequiredArgsConstructor
@RequestMapping("member")
public class MemberController {@PostMapping("/register")public R<Void> register(@RequestBody @Valid Member member) {System.out.println(member);return R.success();}
}

5、测试

 输入一个格式错误的身份证号:

###
POST http://localhost:8080/member/register
Content-Type: application/json
{"idNo": "811111111111111111"}
输出:
{"code": -1,"msg": "不是有效的身份证号"
}

 输入一个格式正确的身份证号(该身份证号是我随机生成的):

###
POST http://localhost:8080/member/register
Content-Type: application/json
{"idNo": "12010319881011691X"}
输出:
{"code": 0,"msg": "success"
}

三、总结

ConstraintValidator 是 javax validation 规范提供给我们的一个实现数据校验的接口。

像 hibernate.validator 就有很多这个接口的实现,像我们常见的

  • NotNullValidator
  • MaxValidatorForMonetaryAmount
  • MinValidatorForMonetaryAmount

等都是它的实现。以上代码,参考 NotNullValidator 的实现。

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

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

相关文章

【PRISMA卫星有关简介】

PRISMA卫星是一颗小型超光谱成像卫星&#xff0c;以下是对其的详细介绍&#xff1a; 一、基本信息 英文全称&#xff1a;Prototype Research Instruments and Space Mission technology Advancement Main&#xff0c;或简化为PRISMA。发射时间&#xff1a;PRISMA卫星于2019年…

ArduSub程序学习(11)--EKF实现逻辑④

1.controlFilterModes() controlFilterModes() 是 NavEKF2_core 类中的一个关键函数&#xff0c;用于控制和管理扩展卡尔曼滤波器&#xff08;EKF&#xff09;的不同工作模式。该函数在 UpdateFilter 方法中被调用&#xff0c;确保滤波器根据系统状态&#xff08;如飞行状态、…

如何快速建立自己的异地互联的远程视频监控系统,通过web浏览器可以直接查看公网上的监控视频(上)

目录 一、需求 二、方案 2.1、计划方案 2.2、实施准备 2.2.1所需配置的产品和服务 2.2.1.1云主机 &#xff08;1&#xff09;选择云平台 &#xff08;2&#xff09;配置云服务器 2.2.2.2视频监控平台软件 &#xff08;1&#xff09;视频监控平台软件 &#xff08;2&am…

Gromacs位置限制问题

Atom index n in position_restraints out of bounds A common problem is placing position restraint files for multiple molecules out of order.(一个常见的问题是无序放置多个分子的位置约束文件。)Recall that a position restraint itp (page 449) file containing a …

08_OpenCV文字图片绘制

import cv2 import numpy as npimg cv2.imread(image0.jpg,1) font cv2.FONT_HERSHEY_SIMPLEXcv2.rectangle(img,(500,400),(200,100),(0,255,0),20) # 1 dst 2 文字内容 3 坐标 4 5 字体大小 6 color 7 粗细 8 line type cv2.putText(img,flower,(200,50),font,1,(0,0,250)…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月30日,星期一

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年9月30日 星期一 农历八月廿八 1、 央行&#xff1a;首套、二套房存量房贷利率批量下调&#xff0c;平均降幅0.5%左右&#xff1b;取消个人房贷重定价周期最短1年限制。 2、 住建部&#xff1a;对商品房建设严控增量、优化…

FPGA实现PCIE视频采集转SDI输出,基于GTX+XDMA中断架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案本博已有的 SDI 编解码方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存SDI视频编码之-->RGB转BT1120SDI视频编码之-->SMPTE SD/HD…

【C语言指南】数据类型详解(上)——内置类型

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 目录 引言 1. 整型&#xff08;Integer Types&#xff09; 2. 浮点型&#xff08;Floating-Point …

atop系统监控工具

atop命令可以看作是top命令的增强版&#xff0c;它可以显示更详细的进程信息&#xff0c;如进程的CPU使用率、进程的内存使用率、进程的I/O使用率、网络使用率等&#xff1b;提供更丰富的统计信息及更灵活的配置&#xff0c;可以通过参数来控制显示内容和行为。 1、top和atop对…

x-cmd pkg | tokei - 代码统计利器,助你快速了解项目进度

目录 简介首次用户技术特点竞品和相关项目进一步阅读 简介 tokei 是一个使用 Rust 编写的显示有关代码统计信息的命令行工具&#xff0c;可以分门别类的统计目录内的代码行数。 tokei 具有良好的跨平台性&#xff0c;可以在 Linux、macOS、Windows 等多种平台上安装运行。 首…

国产长芯微LDC8411数模转换芯片DAC完全P2P替代DAC8411

LDC8411&#xff08;16位&#xff09;器件是低功耗、单通道、电压输出数模转换器&#xff08;DAC&#xff09;。它们提供了出色的线性度&#xff0c;并最大限度地减少了不希望的码间瞬态电压&#xff0c;同时在引脚兼容系列中提供了一条简单的升级路径。所有设备都使用一个多功…

ubuntu切换源方式记录(清华源、中科大源、阿里源)

文章目录 前言一、中科大源二、清华源三、阿里源 前言 记录ubunut切换各个源的方式。 备注&#xff1a;更换源之后使用sudo apt-get update更新索引。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、中科大源 地址&#xff1a;https://mirrors.u…

Shell入门基础学习笔记

目录 第1章 Shell概述 第2章 Shell解析器 第3章 Shell脚本入门 第4章 Shell中的变量 4.1 系统变量 4.2 自定义变量 4.3 特殊变量&#xff1a;$n 4.4 特殊变量&#xff1a;$# 4.5 特殊变量&#xff1a;$*、$ 4.6 特殊变量&#xff1a;$&#xff1f; 第5章 运算符 …

4.模拟电子技术笔记——半导体三极管

写在前面 这个是第四个模电笔记&#xff0c;我们讲半导体三极管 这一章的很多概念都很重要&#xff0c;并且有一些需要记忆的内容&#xff0c;要认真对待 笔记部分 1.半导体三极管的基本原理简述 1.1结构&#xff1a; 1.这个箭头是PN结正向导通方向 2.有两个类型&#xf…

PCL 移动立方体重建(HOPPE)

目录 一、概述二、代码三、结果 一、概述 PCL中的 pcl::MarchingCubes<pcl::PointXYZRGBNormal>:函数实现移动立方体重建的代码示例。 二、代码 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/io/ply_io.h> #include <pcl/point…

生成-理解大一统:一文浅谈多模态大模型最新研究进展

在过去几年中&#xff0c;多模态智能的两个关键支柱——理解和生成&#xff0c;取得了显著进展。多模态大型语言模型&#xff08;MLLMs&#xff09;&#xff0c;如 LLaVA&#xff0c;在视觉语言任务&#xff08;例如视觉问答&#xff09;中表现出色。同时&#xff0c;去噪扩散概…

转行AI产品经理前真后悔没看到这篇…

最近AI行业发展势头正盛&#xff0c;很多人私信我说都来问我AI产品经理转行的事&#xff0c;希望我能给一些意见 文科生能不能做产品经理&#xff0c;大家对这些是一头雾水&#xff0c;也不知道AI产品经理具体都做些什么&#xff0c;又要具备那些能力 因为在不同的业务发展不一…

领夹麦克风性价比最高?一文看懂领夹麦克风什么牌子的好

近几年随着网络直播、短视频等新兴行业的发展&#xff0c;筑就了一个全民视频创作的时代。而领夹麦克风也是凭借轻便、便携的特性&#xff0c;获得了广大短视频创作者的青睐&#xff0c;领夹麦克风的需求量也是不断增加。也正是因为如此&#xff0c;如今市面上的领夹麦克风品牌…

一文上手SpringSecurity【八】

RBAC&#xff08;Role-Based Access Control&#xff09;&#xff0c;基于角色的访问控制。通过用户关联角色&#xff0c;角色关联权限&#xff0c;来间接的为用户赋予权限。 一、RBAC介绍 RBAC&#xff08;Role-Based Access Control&#xff09;&#xff0c;即基于角色的访…

企业微信:客户联系自带群发工具和聊天工具

前言 上篇博客介绍了一些客户联系的开启和配置&#xff0c;接下来我们来使用客户联系自带群发工具和聊天工具。 突然发现官方的文档已经很详细了&#xff0c;我这里给出一些简单的描述&#xff1a; 企业微信如何使用群发助手&#xff1f;-帮助中心-企业微信 群发工具 群发消息给…