邮政编码,格式校验:@ZipCode(自定义注解)

目标

自定义一个用于校验邮政编码格式的注解@ZipCode,能够和现有的 Validation 兼容,使用方式和其他校验注解保持一致(使用 @Valid 注解接口参数)。

校验逻辑

有效格式

  1. 不能包含空格;
  2. 应为6位数字;

不校验非空

邮政编码,校验的是格式;不校验是否为空(null 或 空字符串)。如果邮政编码为空,直接通过校验;

核心代码

需要定义的内容包含两个部分:注解@ZipCode和 校验器ZipCodeValidator

注解:@ZipCode

java 复制代码
package com.example.core.validation.zipcode;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 邮政编码。字符串必须是格式正确的邮政编码。正确格式为:6位数字。
 * <p>
 * {@code null} 或 空字符串,是有效的(能够通过校验)。
 * <p>
 * 支持的类型:字符串
 *
 * @author songguanxun
 * @since 1.0
 */
@Target({FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = ZipCodeValidator.class)
public @interface ZipCode {

    /**
     * @return the error message template
     */
    String message() default "邮政编码,格式错误";

    /**
     * @return the groups the constraint belongs to
     */
    Class<?>[] groups() default {};

    /**
     * @return the payload associated to the constraint
     */
    Class<? extends Payload>[] payload() default {};

}

校验器:ZipCodeValidator

java 复制代码
package com.example.core.validation.zipcode;

import com.example.core.constant.PatternConstant;
import org.springframework.util.ObjectUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

/**
 * 邮政编码格式校验器
 */
public class ZipCodeValidator implements ConstraintValidator<ZipCode, String> {

    @Override
    public void initialize(ZipCode constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }


    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (ObjectUtils.isEmpty(value)) {
            return true;
        }

        if (value.contains(" ")) {
            resetMessage(context, "邮政编码,格式错误:不能包含空格");
            return false;
        }

        if (!isValid(value)) {
            resetMessage(context, "邮政编码,格式错误");
            return false;
        }

        return true;
    }


    // 格式为:6位数字
    private static final Pattern PATTERN = Pattern.compile(PatternConstant.ZIP_CODE);


    /**
     * 是有效的格式
     */
    private boolean isValid(CharSequence input) {
        return PATTERN.matcher(input).matches();
    }


    /**
     * 重置提示信息
     */
    private void resetMessage(ConstraintValidatorContext context, String messageTemplate) {
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(messageTemplate).addConstraintViolation();
    }

}

用到的常量

java 复制代码
package com.example.core.constant;

/**
 * 模式-常量
 */
public class PatternConstant {

    /**
     * 全部为数字
     */
    public static final String NUMBERS = "^\\d*$";


    /**
     * 邮政编码:6位数字
     */
    public static final String ZIP_CODE = "^\\d{6}$";
}

使用

@ZipCode 放在需要校验格式的 邮政编码 字段上。

新增用户Param

java 复制代码
package com.example.web.response.model.param;

import com.example.core.constant.PatternConstant;
import com.example.core.validation.zipcode.ZipCode;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

@Schema(name = "新增用户Param")
public class UserAddParam {

    // 其他字段

    @ZipCode
    @Schema(description = "邮政编码", example = "201100", pattern = PatternConstant.ZIP_CODE)
    private String zipCode;

}

校验效果

包含空格

不是6位数字

数字超过6位

包含非数字的字符

相关推荐
立心者021 小时前
SpringBoot中使用TOTP实现MFA(多因素认证)
java·spring boot·后端
QQ_21696290961 天前
Spring Boot 养老院管理系统:从入住、护理到费用结算的全流程实现(源码可领)
java·spring boot·后端
xxwl5851 天前
数据库后端接口测试报告
spring boot·mysql·tomcat
zzzzzz3101 天前
别让大模型直接碰业务:我在 Spring Boot 里给 AI 操作加了一道“可拒绝的闸门”
人工智能·spring boot·spring
知彼解己1 天前
Java 版本演进
java·开发语言·spring boot
夜郎king1 天前
SpringBoot+PostgreSQL + 硅基流动大模型从零搭建 Text-to-SQL 智能问答系统
spring boot·postgresql·text-to-sql·llm大模型
就改了1 天前
MyBatis核心类用法详解
java·spring boot·后端·mybatis
DarLing丶张皇1 天前
【源码】JeecgBoot导出Excel模板
java·spring boot
paopaokaka_luck2 天前
基于springboot3+vue3的智能文库平台(AI智能搜索、AI智能汇总、实时在线状态展示、多格式文档预览与富文本编辑、Echarts图形化分析)
前端·网络·spring boot·网络协议·echarts
zzzll11112 天前
Spring Boot 入门指南:从零开始构建 Java Web 应用
java·前端·spring boot