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


    目标

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

    校验逻辑

    有效格式

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

    不校验非空

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

    核心代码

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

    注解:@ZipCode

    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位数字。
     * 

    * {@code null} 或 空字符串,是有效的(能够通过校验)。 *

    * 支持的类型:字符串 * * @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 {}; }

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    校验器:ZipCodeValidator

    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();
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    用到的常量

    package com.example.core.constant;
    
    /**
     * 模式-常量
     */
    public class PatternConstant {
    
        /**
         * 全部为数字
         */
        public static final String NUMBERS = "^\\d*$";
    
    
        /**
         * 邮政编码:6位数字
         */
        public static final String ZIP_CODE = "^\\d{6}$";
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    使用

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

    新增用户Param

    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;
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    校验效果

    包含空格

    在这里插入图片描述

    不是6位数字

    数字超过6位
    在这里插入图片描述

    包含非数字的字符
    在这里插入图片描述

  • 相关阅读:
    vue3+ts+vant移动端H5项目搭建
    java后端:nacos 实现动态配置
    CMake入门(一)Ubuntu下使用和Window下使用
    Mysql远程登录报错:Host ‘192.168.137.1‘ is not allowed to connect to this MySQL server
    承装修试电力设施许可证怎么办理?承装修试电力设施许可证办理应该注意哪些?
    爬虫工具之Beautiful Soup4
    更快更强更稳定:腾讯向量数据库测评
    AM@两种余项型泰勒公式的对比和总结@常用函数的麦克劳林公式
    Zookeeper 一、Zookeeper简介
    一篇文章学会调优 ClickHouse
  • 原文地址:https://blog.csdn.net/sgx1825192/article/details/133789490