首页 > 编程语言 >Javax Validation 自定义注解校验(身份证号校验)

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

时间:2024-09-28 20:19:35浏览次数:8  
标签:自定义 study 身份证号 校验 member import Validation public

一、场景分析

我们使用 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;

    @Override
    public void initialize(IdCheck constraintAnnotation) {
        // 初始化 pattern
        this.pattern = Pattern.compile(regex);
    }

    @Override
    public 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 {
    // 自定义注解
    @IdCheck
    private 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 的实现。

标签:自定义,study,身份证号,校验,member,import,Validation,public
From: https://blog.csdn.net/matrixlzp/article/details/142550398

相关文章

  • C语言自定义类型:联合体
    目录前言一、联合体1.1联合体类型的声明1.2联合体的特点1.3相同成员的结构体和联合体对比1.4联合体大小的计算1.5联合体的⼀个练习总结前言前面我讲到C语言中的自定义结构——结构体,其实C语言中的自定义结构不只有结构体,还有枚举和联合体,我们今天就来学习一下......
  • 深入剖析 MyBatis-Plus:操作总结、对比与实践案例(CRUD 操作、分页、条件构造器、自动填
    MyBatis-Plus是MyBatis的增强工具,它极大简化了MyBatis的配置和操作,提高了开发效率。本文从基本操作到高阶用法,详细介绍了MyBatis-Plus的常见功能及与MyBatis的区别,并通过实际案例展示其强大的扩展能力。MyBatis-Plus基于MyBatis,但旨在减少开发者的代码量,增强可......
  • 自定义数据源实现读写分离
    说明:读写分离,指把数据库的操作分为读操作、写操作(更新、新增、删除),在多数据库实例(如主从结构)下,把读操作和写操作访问的数据库分开,以此缓解单数据库的压力。读写分离实现的前提,需要数据库之间能同步数据,数据不一致,读写分离没有意义。数据同步可参考下面文章:MySQL主从结构......
  • Ant-design-vue Table 自定义列斑马纹效果
    在AntDesignVue的`Table`组件中,要实现自定义列的斑马纹效果,可以通过设置`rowClassName`属性来实现。以下是一个示例:```html<template> <a-table:data-source="data":rowClassName="rowClassName">  <a-table-columnv-for="columnincolumns":k......
  • 鸿蒙(HarmonyOS)实战开发篇——基于ArkUI现有能力实现自定义弹窗封装方案
    推荐看点鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总【OpenHarmony】鸿蒙南向开发保姆级知识点汇总~持续更新中……场景描述自定义弹窗是应用开发需要实现的基础功能,包括但不限于HarmonyOS开发者文档中定义的模态、半模态、Toast等形式,封装一个好用且和UI组件解耦的弹窗组......
  • Ant-design-vue Table 自定义列斑马纹效果
    业务需求在使用ant-design-vue的Table组件的时候,在某个业务模块的内因其承载的功能比较多,各个条件间界定不明显导致感官上十分的模糊,所以需要增加类似斑马纹的填充区分。table组件自带只支持行的斑马纹而我们需要的是列的斑马纹。table组件本身是不支持的所以只能通过其他方......
  • Ant-design-vue Table 自定义列斑马纹效果
    业务需求在使用ant-design-vue的Table组件的时候,在某个业务模块的内因其承载的功能比较多,各个条件间界定不明显导致感官上十分的模糊,所以需要增加类似斑马纹的填充区分。table组件自带只支持行的斑马纹而我们需要的是列的斑马纹。table组件本身是不支持的所以只能通过其他方......
  • Element UI 自定义Layout前端页面布局
    1.layout下新建front文件夹index.vue中内容<template><divclass="frontLayout"><el-container><el-header><divclass="navBar"><divclass="navBarLeft">......
  • JVM自定义类的加载器
    自定义类的加载器咱们书接上回继续说说自定义类类加载器自定义类加载器有什么用?通过类加载器可以实现非常精妙的插件机制。例如:著名的OSGI组件框架,再如Eclipse的插件机制。类加载器为应用程序提供了一种动态增加新功能的机制,这种机制无须重新打包发布应用程序就能实现。......
  • uniapp [全端兼容] - 详细实现拍照或相册选取图片后插入水印功能,手机拍照或相册上传图
    前言网上的教程乱七八糟且兼容性太差,本文提供优质示例。在uni-app全平台兼容(H5网页网站、支付宝/微信小程序、安卓App、苹果App、nvue)开发中,详解手机从相册选取上传图像后加入水印功能,手机拍摄照相后也可以加入水印,Uniapp给图片添加水印,获取上传或拍摄的图片信息后,为......