Java自定义字段校验注解写法及default关键字作用咨询
关于注解语法的解释
你看到的public String key() default "";不是普通类/接口里声明的业务方法,这是Java注解(Annotation)定义里的专属语法,用来声明注解的可配置参数:
- 这行代码定义了一个名为
key、类型为String的注解参数,你在使用对应注解时,可以手动给这个参数传值,比如@CustomAnno(key = "userName")。 - 这里的
default关键字作用是给这个参数设置默认值:如果使用注解时没有手动给key传值,程序会自动取空字符串""作为该参数的值,不需要每次使用注解都显式配置这个参数。如果注解参数没有写default值,使用注解时必须给该参数传值,否则编译不通过。
注意区分
default的两个常见使用场景:你看到的这个是注解参数的默认值配置,和Java 8之后接口里的default默认方法不是一回事——接口默认方法是给接口方法写默认实现逻辑,注解里的default仅用来设置参数默认取值。
自定义字段正则校验注解实现步骤
你要实现的name字段正则校验,可以按照JSR-380(Bean Validation)规范写自定义校验注解,步骤如下:
- 定义注解本体,搭配元注解指定注解的作用范围、保留时机、绑定的校验器
import jakarta.validation.Constraint; import jakarta.validation.Payload; import java.lang.annotation.*; // 指定注解可以标注在类的字段上 @Target({ElementType.FIELD}) // 指定注解保留到程序运行阶段,方便校验框架通过反射读取注解信息 @Retention(RetentionPolicy.RUNTIME) // 绑定该注解对应的校验逻辑实现类 @Constraint(validatedBy = NamePatternValidator.class) public @interface ValidName { // 校验不通过时的默认错误提示 String message() default "名称仅支持字母、数字、下划线、@符号"; // 校验分组参数,Bean Validation规范要求必须加,默认空数组即可 Class<?>[] groups() default {}; // 校验负载参数,Bean Validation规范要求必须加,默认空数组即可 Class<? extends Payload>[] payload() default {}; }
- 编写对应的校验逻辑实现类
import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; public class NamePatternValidator implements ConstraintValidator<ValidName, String> { // 注意修正你写的正则笔误:[a-zA-z]的范围会包含[\]^`等多余特殊字符,正确字母范围是[a-zA-Z] private static final String VALID_NAME_REGEX = "^[a-zA-Z0-9_@]+$"; @Override public boolean isValid(String fieldValue, ConstraintValidatorContext context) { // 空值放行,如果需要校验非空可以单独搭配@NotBlank等注解使用 if (fieldValue == null) { return true; } return fieldValue.matches(VALID_NAME_REGEX); } }
- 使用方式:直接在需要校验的name字段上标注注解即可
public class User { @ValidName private String name; // 省略getter/setter }
学习资料推荐
- 最权威的入门材料是Oracle官方Java教程中的注解章节,完整覆盖注解定义、元注解、参数配置、运行时读取的全流程规则
- 做校验注解可以看Bean Validation官方文档的自定义约束章节,明确规范要求的写法,避免踩坑
- 国内技术社区可以搜索「Java 自定义注解」「Spring Validation 自定义校验」关键词,找发布时间近、有可运行示例的文章跟着实操,上手很快
内容的提问来源于stack exchange,提问作者arsenal_random_profile
相关产品推荐
相关产品推荐

