Java中可通过自定义注解@StringLength结合ConstraintValidator实现字符串长度校验,需定义注解(声明作用范围、保留策略、min/max默认值)并实现校验逻辑,在实体类字段上使用。

Java 中可以通过自定义注解 + ConstraintValidator 实现字符串长度校验,核心是定义注解、实现校验逻辑、并在实体类字段上使用。
定义自定义注解 @StringLength
注解需声明作用范围(如字段)、保留策略(运行时可用),并指定最小和最大长度,默认值可设为 0 和 Integer.MAX_VALUE,便于灵活使用:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = StringLengthValidator.class)
public @interface StringLength {
String message() default "字符串长度不合法";
int min() default 0;
int max() default Integer.MAX_VALUE;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
实现 ConstraintValidator 接口
创建校验器类,泛型指定为 StringLength 和 String,重写 isValid 方法,对 null 值按需处理(通常允许 null,仅校验非 null 字符串):
public class StringLengthValidator implements ConstraintValidator<StringLength, String> {
private int min;
private int max;
@Override
public void initialize(StringLength constraintAnnotation) {
this.min = constraintAnnotation.min();
this.max = constraintAnnotation.max();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true; // 或 return false,根据业务决定是否允许 null
}
int len = value.length();
if (len < min || len > max) {
// 可选:自定义错误信息
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate())
.addConstraintViolation();
return false;
}
return true;
}
}
在实体类中使用注解
直接加在 String 类型字段上,支持单独设 min/max,也支持只设其一(如只要求不超过 20 字符):
立即学习“Java免费学习笔记(深入)”;
public class User {
@StringLength(min = 2, max = 10, message = "用户名长度必须在 2~10 个字符之间")
private String username;
@StringLength(max = 20)
private String email;
// getter/setter...
}
触发校验(如 Spring Boot 场景)
Controller 方法参数添加 @Valid,配合 @RequestBody 或表单对象即可自动触发校验;校验失败会抛出 MethodArgumentNotValidException,建议统一异常处理返回友好提示:
@PostMapping("/user")
public Result createUser(@Valid @RequestBody User user) {
return Result.success(userService.save(user));
}
不复杂但容易忽略细节:确保项目引入了 spring-boot-starter-validation(Spring Boot 2.3+ 默认不包含,需显式添加);自定义注解类和校验器类要在 Spring 扫描路径下;message 支持 EL 表达式(如 message = "长度应在 {min} 到 {max} 之间")。


















