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(); } }
我們當然可以采用上面的方式進行數(shù)據(jù)校驗,但這種方式不是很優(yōu)雅:
如果項目中還有別的對象需要進行身份證號校驗,那么同樣的代碼就會在項目里散落一地。
Javax Validation 提供給我們另一種優(yōu)雅的方式,進行邏輯重復的數(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)。
到此這篇關于Javax Validation自定義注解進行身份證號校驗的文章就介紹到這了,更多相關Javax Validation自定義注解校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java開發(fā)工作中對InheritableThreadLocal使用思考
這篇文章主要為大家介紹了java開發(fā)工作中對InheritableThreadLocal使用思考詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11Java實現(xiàn)Consul/Nacos根據(jù)GPU型號、顯存余量執(zhí)行負載均衡的步驟詳解
這篇文章主要介紹了Java實現(xiàn)Consul/Nacos根據(jù)GPU型號、顯存余量執(zhí)行負載均衡的步驟詳解,本文分步驟結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2025-04-04Spring Boot security 默認攔截靜態(tài)資源的解決方法
這篇文章主要介紹了Spring Boot security 默認攔截靜態(tài)資源,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03解決springboot項目啟動報錯Error creating bean with&nb
這篇文章主要介紹了解決springboot項目啟動報錯Error creating bean with name dataSourceScriptDatabaseInitializer問題,具有很好的參考價值,希望對大家有所幫助2024-03-03解決"XML Parser Error on line 1: 前言中不允許有內(nèi)容"錯誤
解決用windows自帶的記事編輯xml文件后出現(xiàn) "XML Parser Error on line 1: 前言中不允許有內(nèi)容。"的錯誤2018-02-02Java 為什么要避免使用finalizer和Cleaner
這篇文章主要介紹了Java 為什么要避免使用finalizer和Cleaner,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下2021-03-03Java如何解析html中的內(nèi)容并存到數(shù)據(jù)庫詳解
最近用到了Java解析Html的一個庫Jsoup,所以下面這篇文章主要給大家介紹了關于Java如何解析html中的內(nèi)容并存到數(shù)據(jù)庫的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-03-03