@NotBlank注解校验失效:请求未触发校验直接返回201问题求助
校验注解未生效,请求返回201而非校验异常
我定义了带校验字段的DTO类,发送缺少必填字段的请求时,预期触发校验异常,但接口返回了201状态码。已经添加了javax.validation依赖,并且在@RequestBody前加了@Valid注解,找不到问题所在。
DTO类代码
import javax.validation.constraints.NotBlank; import lombok.Data; @Data public class AddressDto { @NotBlank(message = "The country is required.") private String country; @NotBlank(message = "The city is required.") private String city; @NotBlank(message = "The Zip code is required.") private String zipCode; @NotBlank(message = "The street name is required.") private String street; private String state; }
Controller类代码
package com.controller; import com.model.dto.AddressDto; import javax.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor @RequestMapping("/api") public class AddressController { @PostMapping("/test") public ResponseEntity<AddressDto> registerUser(@Valid @RequestBody AddressDto registerUserDto) { return new ResponseEntity<>(registerUserDto, HttpStatus.CREATED); } }
Postman请求与响应截图

可能的解决方法
- 检查Spring Boot版本:如果是2.3及以上版本,需额外添加
spring-boot-starter-validation依赖。Spring Boot 2.3开始将validation starter从web starter中拆分,仅引入javax.validation依赖不足以启用校验功能。 - 排查全局异常处理器:若存在自定义全局异常处理器,确认是否捕获了
MethodArgumentNotValidException或BindException。如果未处理这类异常,校验失败时的异常可能被吞掉,导致接口仍返回201。需添加对应异常处理逻辑,返回400状态码及校验错误信息。 - 确认请求参数与DTO字段匹配:检查请求JSON的字段名是否和DTO属性名完全一致(比如驼峰
zipCode和小写zipcode的差异),字段不匹配会导致属性值为null,但@NotBlank仅校验空字符串/空白,若字段未被正确映射,可能无法触发校验。 - 校验注解位置:确保
@Valid注解正确加在@RequestBody之前,位置错误会导致校验不生效。 - 检查校验功能是否开启:确认项目未手动关闭Spring的自动校验配置,Spring Boot默认会自动启用,若手动关闭需添加
@EnableValidation注解开启。
内容的提问来源于stack exchange,提问作者mroma95
相关产品推荐
相关产品推荐

