身份证自定义校验注解validation

该文章提供了一个使用Java编写的身份证号码校验的注解和工具类。注解包含多个验证规则,如非空、长度和格式验证。工具类包含了一套完整的身份证号码合法性检查方法,包括正则匹配、省编码验证、校验位计算等。
/**
 * 身份证号 @IdCard代码如下
 */
@Excel(name = "身份证号", orderNum = "1", width = 50)
@NotNull(message = "身份证号不能为空")
@Length(min = 18, max = 18, message = "身份证号长度有误")
@IdCard(message = "身份证格式不对")
private String idCard;
/**
 * 校验身份证号码
 * @author zhouyanhaung
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IdCardValidator.class)
@Documented
public @interface IdCard {
 
    String message() default "";
 
    Class<?>[] groups() default {};
 
    Class<? extends Payload>[] payload() default {};
}
/**
 * @author zhouyanhuang
 * @date 2021-08-06 14:50
 * 实现注解IdCard
 */
public class IdCardValidator implements ConstraintValidator<IdCard, String> {
 
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 校验逻辑...
        if (value == null) {
            return true;
        }
        return IdCardUtil.identityCodeValid(value).isSuccess();
    }
}

编写身份证校验的工具类

import io.micrometer.common.util.StringUtils;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;

/**
 * @Author zhouyanhuang:
 * @Date 2023/4/24 17:06
 * @Version 1.0
 */

public class IdCardUtil {
    /**
     * 一代身份证
     */
    private static final Integer FIRST_GENERATION_ID_CARD = 15;

    /**
     * 二代身份证
     */
    private static final Integer SECOND_GENERATION_ID_CARD = 1
### 实现身份证号码格式验证 为了在 Java 中实现对中国身份证号码的格式验证,可以采用多种方法。一种常见的方式是在实体类中使用自定义注解来完成这一功能。 #### 创建自定义注解 `@Cid` 通过创建名为`Cid.java`的文件来自定义注解: ```java import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Constraint(validatedBy = CidValidator.class) @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface Cid { String message() default "无效的身份证号"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` 此部分代码定义了一个新的约束条件,并指定了该约束应由哪个验证器处理[^2]。 #### 编写验证逻辑 `CidValidator.java` 接下来编写具体的验证逻辑,在`CidValidator.java`文件内实现: ```java import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class CidValidator implements ConstraintValidator<Cid, String> { @Override public void initialize(Cid cid) {} @Override public boolean isValid(String value, ConstraintValidatorContext context){ if(value == null || !value.matches("\\d{17}[\\dxX]|\\d{15}")){ return false; } // 进一步检查有效性... // 可以加入更严格的算法如加权求和取模等 return true; } } ``` 上述代码实现了基本的身份认证规则,即确保输入符合标准模式:前17位为纯数字加上最后一位可能是大写字母'X'[^4]。 #### 应用于实体类属性上 最终可以在需要的地方应用这个新创建好的注解来进行字段级别的参数校验操作,如下所示: ```java package com.exchange.command.personal; import lombok.Getter; import lombok.Setter; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; @Getter @Setter public class PersonalReq{ @NotEmpty(message = "姓名不能为空") @Length(max = 30, min = 2,message = "姓名长度限制2~30字符") private String name; // 添加身份证校验注解 @NotEmpty(message = "身份证号不能为空") @Cid private String certNo; } ``` 这段代码展示了如何将之前定义过的`@Cid`应用于实际业务对象中的某个特定成员变量之上[^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值