亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Javax Validation自定義注解進行身份證號校驗

 更新時間:2024年10月24日 10:39:02   作者:matrixlzp  
這篇文章主要為大家詳細介紹了如何通過Javax Validation自定義注解進行身份證號校驗,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下

一、場景分析

我們使用 SpringMVC 在 Controller 層,對身份證號進行數(shù)據(jù)校驗的話,經(jīng)常采用以下方式:

@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();
    }
}

我們當(dāng)然可以采用上面的方式進行數(shù)據(jù)校驗,但這種方式不是很優(yōu)雅:

如果項目中還有別的對象需要進行身份證號校驗,那么同樣的代碼就會在項目里散落一地。

Javax Validation 提供給我們另一種優(yōu)雅的方式,進行邏輯重復(fù)的數(shù)據(jù)校驗。

二、代碼實現(xiàn)

1、創(chuàng)建自定義校驗注解

首先創(chuàng)建一個自定義的校驗注解,用于校驗字符串是否為有效的身份證號格式

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、創(chuàng)建校驗器實現(xiàn)類

創(chuàng)建一個實現(xiàn) ConstraintValidator 接口的類來實現(xiàn)自定義校驗邏輯

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、在控制器中進行數(shù)據(jù)綁定和校驗 

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"
}

三、總結(jié)

ConstraintValidator 是 javax validation 規(guī)范提供給我們的一個實現(xiàn)數(shù)據(jù)校驗的接口。

像 hibernate.validator 就有很多這個接口的實現(xiàn),像我們常見的

  • NotNullValidator
  • MaxValidatorForMonetaryAmount
  • MinValidatorForMonetaryAmount

等都是它的實現(xiàn)。以上代碼,參考 NotNullValidator 的實現(xiàn)。

到此這篇關(guān)于Javax Validation自定義注解進行身份證號校驗的文章就介紹到這了,更多相關(guān)Javax Validation自定義注解校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring強大事務(wù)兼容數(shù)據(jù)庫多種組合解決業(yè)務(wù)需求

    Spring強大事務(wù)兼容數(shù)據(jù)庫多種組合解決業(yè)務(wù)需求

    這篇文章主要為大家介紹了Spring強大事務(wù)兼容數(shù)據(jù)庫多種組合解決業(yè)務(wù)需求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • java實現(xiàn)Floyd算法

    java實現(xiàn)Floyd算法

    這篇文章主要為大家詳細介紹了java實現(xiàn)Floyd算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 詳解如何保證Java本地緩存的一致性

    詳解如何保證Java本地緩存的一致性

    所謂的一致性是指在同時使用緩存和數(shù)據(jù)庫的場景下,要確保數(shù)據(jù)在緩存與數(shù)據(jù)庫中的更新操作保持同步,那么,怎么保證Java本地緩存的一致性?所以本文將給大家介紹了如何保證Java本地緩存的一致性,需要的朋友可以參考下
    2024-01-01
  • springboot如何使用logback-spring配置日志格式,并分環(huán)境配置

    springboot如何使用logback-spring配置日志格式,并分環(huán)境配置

    這篇文章主要介紹了springboot如何使用logback-spring配置日志格式,并分環(huán)境配置的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 論Java Web應(yīng)用中調(diào)優(yōu)線程池的重要性

    論Java Web應(yīng)用中調(diào)優(yōu)線程池的重要性

    這篇文章主要論述Java Web應(yīng)用中調(diào)優(yōu)線程池的重要性,通過了解應(yīng)用的需求,組合最大線程數(shù)和平均響應(yīng)時間,得出一個合適的線程池配置
    2016-04-04
  • 在Eclipse中使用版本管理工具SVN的圖文教程

    在Eclipse中使用版本管理工具SVN的圖文教程

    下面小編就為大家分享一篇在Eclipse中使用版本管理工具SVN的圖文教程,具有很好的參考價值,一起跟隨小編過來看看吧
    2017-11-11
  • Java基于TCP方式的二進制文件傳輸

    Java基于TCP方式的二進制文件傳輸

    這篇文章主要為大家介紹了Java基于TCP方式的二進制文件傳輸,一個基于Java Socket協(xié)議之上文件傳輸?shù)耐暾纠赥CP通信完成,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Mybatis返回單個實體或者返回List的實現(xiàn)

    Mybatis返回單個實體或者返回List的實現(xiàn)

    這篇文章主要介紹了Mybatis返回單個實體或者返回List的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Spring延遲Bean初始化的實現(xiàn)示例

    Spring延遲Bean初始化的實現(xiàn)示例

    延遲初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用時才創(chuàng)建及初始化Bean,本文主要介紹了Spring延遲Bean初始化的實現(xiàn)示例,感興趣的可以了解一下
    2024-06-06
  • Java獲取配置文件的值過程解析

    Java獲取配置文件的值過程解析

    這篇文章主要介紹了java獲取配置文件的值過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01

最新評論