You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:55:25