Spring Boot中@Size、@Email等校验注解失效问题求助
校验注解不生效的解决方案
核心原因:Spring Boot 3版本适配问题
你使用的Spring Boot 3.2.2基于Jakarta EE规范,但代码里仍用旧的javax.validation包下的注解,两者不兼容;同时pom.xml里的依赖存在冲突,直接导致所有校验注解失效。
解决步骤:
1. 替换注解的包路径
将UserDto中的校验注解导入从javax.validation替换为jakarta.validation,同时确保字段能被校验框架访问到(用Lombok的@Data生成getter/setter,或手动编写):
import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; import lombok.Data; @Data @Component public class UserDto { private int userId; @Size(min=3, max=15, message = "invalid username !") private String name; @Email(message = "invalid email !") @NotBlank(message = "email is required !") private String email; @NotBlank(message = "password is required !") private String password; @Size(min=2, max=6, message = "invalid gender !") private String gender; }
若未使用Lombok,必须手动给每个字段添加getter/setter方法,校验框架需要通过getter读取属性值完成校验。
2. 清理pom.xml中的冲突依赖
移除手动添加的validation-api依赖,spring-boot-starter-validation已经包含了适配Spring Boot 3的Jakarta版本校验API,重复引入会引发依赖冲突:
<!-- 删除这段冗余依赖 --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.0.Final</version> </dependency>
3. 可选:添加全局校验异常处理器(返回友好错误)
如果希望校验失败时返回结构化的错误信息而非默认500异常,可以添加全局异常处理器:
import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.HashMap; import java.util.Map; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<Map<String, String>> handleValidationErrors(MethodArgumentNotValidException ex) { Map<String, String> errorMap = new HashMap<>(); ex.getBindingResult().getAllErrors().forEach(error -> { String fieldName = ((FieldError) error).getField(); String errorMsg = error.getDefaultMessage(); errorMap.put(fieldName, errorMsg); }); return new ResponseEntity<>(errorMap, HttpStatus.BAD_REQUEST); } }
内容的提问来源于stack exchange,提问作者Vaibhav Gupta
相关产品推荐
相关产品推荐

