自定义注解校验身份证代码
时间: 2023-10-09 22:10:59 浏览: 97
详解使用Spring AOP和自定义注解进行参数检查
好的,以下是一个自定义注解校验身份证的代码示例:
首先,我们需要定义一个注解 `@IdNumber`,用于标注需要进行身份证校验的字段:
```java
@Documented
@Constraint(validatedBy = IdNumberValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface IdNumber {
String message() default "身份证号码不正确";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
```
其中,`@Constraint(validatedBy = IdNumberValidator.class)` 表示该注解需要使用 `IdNumberValidator` 进行校验。
接着,我们需要实现 `IdNumberValidator`:
```java
public class IdNumberValidator implements ConstraintValidator<IdNumber, String> {
@Override
public void initialize(IdNumber constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (StringUtils.isBlank(value)) {
return true;
}
return isIdNumber(value);
}
/**
* 身份证校验
*
* @param idNumber 身份证号码
* @return 是否有效
*/
private boolean isIdNumber(String idNumber) {
String regex = "^\\d{15}$|^\\d{17}[0-9Xx]$";
if (!idNumber.matches(regex)) {
return false;
}
String provinceCode = idNumber.substring(0, 2);
if (!ProvinceCodeUtils.isValidProvinceCode(provinceCode)) {
return false;
}
if (!isValidBirthDate(idNumber)) {
return false;
}
return isValidCheckCode(idNumber);
}
/**
* 校验生日日期
*
* @param idNumber 身份证号码
* @return 是否有效
*/
private boolean isValidBirthDate(String idNumber) {
String birthDateStr;
if (idNumber.length() == 15) {
birthDateStr = "19" + idNumber.substring(6, 12);
} else {
birthDateStr = idNumber.substring(6, 14);
}
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
format.setLenient(false);
try {
format.parse(birthDateStr);
} catch (ParseException e) {
return false;
}
return true;
}
/**
* 校验校验码
*
* @param idNumber 身份证号码
* @return 是否有效
*/
private boolean isValidCheckCode(String idNumber) {
if (idNumber.length() == 15) {
return true;
}
char[] idCharArray = idNumber.toCharArray();
int[] idIntArray = new int[17];
for (int i = 0; i < 17; i++) {
idIntArray[i] = Integer.parseInt(String.valueOf(idCharArray[i]));
}
int[] weightFactorArray = new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += idIntArray[i] * weightFactorArray[i];
}
int checkCodeIndex = sum % 11;
char[] checkCodeArray = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
char checkCode = checkCodeArray[checkCodeIndex];
return checkCode == idCharArray[17];
}
}
```
其中,`isValid` 方法用于进行身份证校验,`isValidBirthDate` 方法用于校验生日日期,`isValidCheckCode` 方法用于校验校验码。
最后,在需要进行身份证校验的字段上使用 `@IdNumber` 注解即可:
```java
public class User {
@IdNumber
private String idNumber;
// getter/setter 略
}
```
这样,在使用 `@Valid` 注解校验实体时,如果 `idNumber` 字段不符合身份证规则,则会抛出 `ConstraintViolationException` 异常。
阅读全文