欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

我們當然可以采用上面的方式進行數(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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論