自定义校验注解需要定义一个接口并配合 @constraint 指定校验器,同时在参数上使用该注解即可生效。具体做法是创建一个标记接口,通过 @constraint(validatedby = ...) 绑定具体的 validator 实现类,并在该实现中编写校验逻辑。spring boot 会自动识别这些注解并在请求进入控制器前执行校验。

如何定义带参数的自定义校验注解
定义带参数的注解需要在接口中声明方法,并在 @Constraint 的 groups 和 payload 字段中保持默认行为。以校验字符串长度为例,可以定义 MinLength 注解,设置默认最小长度为 0,并在对应的 Validator 中读取该值进行比对。

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = MinLengthValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MinLength {
String message() default "字符串长度不足";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int value() default 0;
}
对应的校验器实现如下:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class MinLengthValidator implements ConstraintValidator<MinLength, String> {
private int minLength;
@Override
public void initialize(MinLength constraintAnnotation) {
this.minLength = constraintAnnotation.value();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) return true; // 空值由 NotNull 处理
return value.length() >= minLength;
}
}
在实体类中使用:
@MinLength(value = 5, message = "用户名至少5个字符") private String username;
如何在 Controller 中获取校验错误信息
在 Controller 方法参数中添加 @Valid 或 @Validated 注解,并使用 BindingResult 捕获校验结果。如果校验失败,可以通过 BindingResult.getAllErrors() 获取所有错误对象,进而提取字段名和错误消息返回给前端。

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/api")
public class UserController {
@PostMapping("/register")
public String register(@RequestBody UserDTO userDTO, BindingResult result, Model model) {
if (result.hasErrors()) {
for (var error : result.getFieldErrors()) {
System.out.println(error.getField() + ": " + error.getDefaultMessage());
}
model.addAttribute("errors", result.getFieldErrors());
return "error-page";
}
// 处理业务逻辑
return "success";
}
}
当输入为空字符串时自定义注解的行为是什么
在上述 MinLengthValidator 的实现中,当输入值为空字符串("")时,isValid 方法会检查其长度是否大于等于设定的最小值。如果最小值为 5,则空字符串长度为 0,不满足条件,返回 false,触发校验失败。若希望空字符串也视为合法(即仅对非空值校验),需在 isValid 中显式判断 value.isEmpty() 并返回 true,此时应由 @NotNull 或 @NotBlank 来约束非空性。


















