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

Spring Boot 3.0.1无法找到@NotBlank等校验注解的解决求助

Spring Boot 3.0.1 校验注解问题解决指南

核心原因:注解包路径迁移

Spring Boot 3.0基于Jakarta EE规范,不再沿用Java EE的javax包体系。你要找的@NotBlank、@NotNull、@NotEmpty这些校验注解,已经从javax.validation.constraints迁移到了jakarta.validation.constraints包下——不是Spring Boot移除了它们,只是导入路径变了。

依赖简化:只保留必要的starter

你的build.gradle里已经添加了spring-boot-starter-validation,这个starter已经自动包含了适配Jakarta的Hibernate Validator 8.x,以及必要的EL依赖。之前手动添加的hibernate-validator、hibernate-validator-cdi等零散依赖都是多余的,直接删掉即可。

最终只需保留这一行依赖:

implementation 'org.springframework.boot:spring-boot-starter-validation'

实现校验的完整步骤

1. 实体类添加校验注解

确保导入的是Jakarta包下的注解:

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

public class User {
    @NotNull(message = "用户ID不能为空")
    private Long id;

    @NotBlank(message = "用户名不能为空")
    @Size(min = 2, max = 20, message = "用户名长度需在2-20之间")
    private String username;

    // getter、setter方法省略
}

2. Controller触发校验

在接收实体参数的方法上添加@Valid或@Validated注解,触发校验逻辑:

import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @PostMapping("/users")
    public String createUser(@Valid @RequestBody User user) {
        // 执行业务逻辑
        return "用户创建成功";
    }
}

3. 统一处理校验异常(可选)

通过全局异常处理器返回标准化的错误信息:

import jakarta.validation.ConstraintViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindException;
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(BindException.class)
    public ResponseEntity<Map<String, String>> handleBindException(BindException e) {
        Map<String, String> errors = new HashMap<>();
        e.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage())
        );
        return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
    }

    // 处理其他校验异常
    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<Map<String, String>> handleConstraintViolationException(ConstraintViolationException e) {
        Map<String, String> errors = new HashMap<>();
        e.getConstraintViolations().forEach(violation -> 
            errors.put(violation.getPropertyPath().toString(), violation.getMessage())
        );
        return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
    }
}

关于GlassFish Expressly依赖的说明

Hibernate文档提到的expressly依赖,Spring Boot的validation starter已经通过传递依赖引入了对应的Jakarta EL实现(如org.glassfish:jakarta.el),不需要手动添加,直接使用starter即可。

内容的提问来源于stack exchange,提问作者M Nouman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:25:30