Spring Boot中@NotBlank等校验注解未生效问题求助
问题解决:Spring Boot 3.0.2 校验注解不生效
问题根源
Spring Boot 3.x 基于 Jakarta EE 9+,Java EE 的 API 命名空间已从 javax.* 迁移到 jakarta.*。你当前使用的是旧版 javax.validation.constraints 包下的校验注解,Spring Boot 3 无法识别这些注解,导致校验逻辑不触发。同时依赖中多余引入的 javax.validation:validation-api 也会进一步干扰校验机制。
修复步骤
1. 替换实体类的校验注解包
将实体类里的 javax.validation.constraints 替换为 jakarta.validation.constraints:
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; public class WatchlistItem { @NotBlank(message="You cannot leave it empty") private String title; private String rating; @NotBlank(message = "cannot leave blank") private String priority; @Size(max = 50, message = "The maximum characters are 50") private String comment; // 其余代码保持不变 }
2. 清理 pom.xml 依赖
移除多余的 javax.validation:validation-api 依赖,spring-boot-starter-validation 无需指定版本(Spring Boot parent 已统一管理对应版本):
<!-- 删除以下旧依赖 --> <!-- <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> --> <!-- 保留此依赖即可 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
3. 确认控制器的@Valid注解包
检查控制器中的 @Valid 注解是否来自 jakarta.validation.Valid,若为旧版 javax.validation.Valid 需同步替换:
import jakarta.validation.Valid; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.ModelAndView; @PostMapping("/watchlistItemForm") public ModelAndView submitWatchlistItemForm(@Valid WatchlistItem watchlistItem, BindingResult bindingResult ){ if (bindingResult.hasErrors()){ return new ModelAndView ("watchlistItemForm"); } WatchlistItem updateItem = getWatchListItemById(watchlistItem.getId()); // 其余代码保持不变 }
验证修复
重启应用后测试title字段留空的提交场景,此时校验逻辑会正常触发,页面将返回表单并携带错误提示。
内容的提问来源于stack exchange,提问作者Nick Sharma
相关产品推荐
相关产品推荐

