Spring Boot 2.5.1版本REST API中DTO校验注解不生效问题求助
问题根因与修复方案
1. 数值校验注解类型不匹配
你当前DTO中vlanId为String类型,@Min、@Max注解仅对Integer、Long等数值类型生效,对String类型不会触发校验。
可二选一修复:
// 方案1:改为数值类型,同时修复你原本@Max值和message不匹配的笔误 @NotNull(message = "vlanId不能为空") @Min(value = 1, message = "Vlan ID : Minimum 1.") @Max(value = 4096, message = "Vlan ID : Maximum 4096") private Integer vlanId; // 方案2:保留String类型,改用正则校验数字范围 @Pattern(regexp = "^([1-9]\\d{0,3}|40[0-8]\\d|409[0-6])$", message = "Vlan ID范围为1-4096") private String vlanId;
2. 依赖冲突导致校验组件失效
你的POM文件存在两处严重版本不兼容问题,会破坏Spring Web的核心校验逻辑:
- 引入了适配Spring4的
thymeleaf-spring4和2.1.x版本的thymeleaf,而Spring Boot 2.5.1基于Spring 5开发,版本不匹配会冲突破坏校验组件。请移除现有两个thymeleaf依赖,替换为官方适配的starter:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
- 引入了scope为provided的
javaee-api,部分容器可能缺少validation相关的实现类,非必要可直接移除该依赖,若必须保留请确认运行容器包含完整的validation-api实现。
修改完依赖后请清空Maven本地缓存,重新打包运行,避免旧依赖残留。
3. 其他排查点
- 确认所有校验注解均从
javax.validation.constraints包导入,不要误导入jakarta.validation或其他自定义包下的同名注解,Spring Boot 2.x版本统一使用javax包下的校验规范。 - 确认
ValidationHandler类所在的包路径在Spring Boot启动类的扫描范围内,否则@ControllerAdvice不会生效,就算校验抛出异常也无法返回错误信息,容易误以为校验未触发。 - 确认请求头
Content-Type设置为application/json,否则@RequestBody无法正常解析参数,自然不会触发校验逻辑。
内容的提问来源于stack exchange,提问作者Bilal Dekar
相关产品推荐
相关产品推荐

