在 spring boot 中,使用 @valid 注解可以自动触发 jsr-303/jsr-380 bean validation 机制,对 controller 接收到的参数进行校验。具体做法是在 controller 方法的参数前添加 @valid(或 @validated),并确保项目中引入了 hibernate validator 依赖;当参数不满足约束条件时,框架会自动抛出 methodargumentnotvalidexception 异常,你可以通过全局异常处理器将其转换为统一的 json 错误响应。

如何配置并捕获 @Valid 抛出的异常?
要处理 @Valid 校验失败的情况,需要定义一个全局异常处理器来拦截 MethodArgumentNotValidException。在该处理器中,提取第一个字段的错误信息,并将其封装为标准的错误响应对象返回给前端。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<string> handleValidationExceptions(MethodArgumentNotValidException ex) {
String errorMessage = ex.getBindingResult().getFieldErrors().stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.findFirst()
.orElse("Validation Failed");
return ResponseEntity.badRequest().body(errorMessage);
}
}</string>
如何在 DTO 中定义具体的校验规则?
校验规则定义在数据传输对象(DTO)的字段上,使用如 @NotBlank、@Size、@Email 等注解。这些注解构成了校验的具体逻辑,只有当传入的数据违反这些规则时,才会触发异常。

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
public class UserDTO {
@NotBlank(message = "Name cannot be blank")
private String name;
@Email(message = "Invalid email format")
private String email;
@Size(min = 5, max = 20, message = "Password must be between 5 and 20 characters")
private String password;
// Getters and Setters
}
如果 DTO 中的某个字段为空字符串,@NotBlank 会校验通过吗?
不会。对于 UserDTO 中的 name 字段,如果传入的是空字符串 "",@NotBlank 校验会失败。因为 @NotBlank 不仅检查是否为 null,还检查去除首尾空格后长度是否大于 0。相比之下,@NotNull 只检查非空值,而 @NotEmpty 检查非 null 且长度大于 0(对于字符串)。因此,空字符串会导致校验报错,确保数据的有效性。











