Spring Boot 中自定义中文校验注解的实现

正文:

在实际的应用开发中,我们经常需要对接口的输入进行校验,确保数据的合法性。在Spring Boot项目中,通过使用Hibernate Validator等校验框架,可以轻松地实现各种校验需求。本文将介绍如何自定义一个中文校验注解,并利用该注解实现对输入是否为中文字符的校验。

1. 创建自定义中文校验注解

首先,我们创建一个自定义注解@Chinese,用于标记需要进行中文校验的字段或参数。以下是注解的定义:

java 复制代码
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * 中文校验注解
 */
@Documented
@Constraint(validatedBy = ChineseValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Chinese {
    // 默认错误提示信息
    String message() default "必须为中文字符";

    // 分组
    Class<?>[] groups() default {};

    // 负载
    Class<? extends Payload>[] payload() default {};
}

2. 创建中文校验器

接下来,我们需要实现中文校验的逻辑。为此,创建一个ChineseValidator类,实现ConstraintValidator<Chinese, String>接口:

java 复制代码
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

/**
 * 中文校验器
 */
public class ChineseValidator implements ConstraintValidator<Chinese, String> {

    // 中文字符的正则表达式
    private static final Pattern CHINESE_PATTERN = Pattern.compile("^[\u4e00-\u9fa5]+$");

    @Override
    public void initialize(Chinese constraintAnnotation) {
    }

    /**
     * 校验方法
     * @param value 待校验的字符串
     * @param context 校验上下文
     * @return 校验结果,true表示通过,false表示不通过
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 如果值为null,由 @NotBlank 校验
        if (value == null) {
            return true;
        }
        // 使用正则表达式匹配中文字符
        return CHINESE_PATTERN.matcher(value).matches();
    }
}

3. 在实体类或DTO中应用注解

现在,我们可以在需要进行中文校验的字段上应用@Chinese注解。例如,假设有一个包含姓名的请求DTO:

java 复制代码
public class YourRequestDTO {
    
    @NotBlank(message = "姓名不能为空")
    @Chinese
    private String name;

    // 其他字段...
}

在这个例子中,name字段通过@Chinese注解进行了中文校验。当请求中的name字段不是中文字符时,将触发校验错误,并返回指定的错误提示信息。

通过自定义中文校验注解,我们可以在Spring Boot项目中方便地实现对输入是否为中文字符的校验,提高系统的数据质量和安全性。

相关推荐
折哥的程序人生 · 物流技术专研16 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
一条泥憨鱼16 小时前
【Redis】数据类型和常用命令
java·数据库·redis·后端·缓存
云烟成雨TD16 小时前
Spring AI Alibaba 1.x 系列【78】沙箱(Sandbox)
java·人工智能·spring
程序员二叉16 小时前
【Java】 异常高频面试题精讲 | 易错点+对比总结
java·开发语言·面试
周航宇JoeZhou17 小时前
JB3-9-SpringAI(二)
java·ai·agent·多智能体·调度·智能体·观察
好家伙VCC17 小时前
Web Components主题热切换方案揭秘
java·前端
慕木沐17 小时前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
焦虑的说说18 小时前
秒杀系统设计方案
java
许彰午18 小时前
30_Java Stream流操作全解
java·windows·python
qq_25183645718 小时前
基于java Web网络订餐系统设计与实现 源码文档
java·开发语言·前端