Spring中Jakarta @Nonnull注解未触发校验错误的原因排查
问题:Spring/Jakarta校验中@Nonnull注解未生效
我正在学习Spring与Jakarta的校验机制,创建了如下Rest控制器:
@RestController class EmailController { @PostMapping(path = ["/email"]) fun post( @RequestBody @Validated email: SendEmailRequest ) : SendEmailRequest { return email } }
以及包含嵌套类的请求类:
class Request { @Nonnull @Valid val email: Letter? = null } class Letter { @Nonnull @Valid val receiver: EmailContact? = null @NotBlank val header: String = "" val plainText: String = "" val htmlContent: String = "" }
通过Postman发送请求体:
{ "email": { "header": "" } }
预期响应应同时包含email.receiver的非空校验错误和email.header的非空空白校验错误:
{ "email.receiver": [ "must not be null" ], "email.header": [ "must not be blank" ] }
但实际响应仅触发了email.header的校验错误:
{ "email.header": [ "must not be blank" ] }
请问为何@Nonnull注解未生效?
原因及解决办法
- 注解类型不匹配:你使用的
@Nonnull属于JSR 305标记注解(常见于javax.annotation.Nonnull或Guava包),它仅作为代码提示标识,不属于Jakarta Bean Validation(原JSR 380)的标准校验注解,Spring校验框架不会自动执行它的校验逻辑。 - 标准非空校验注解:Jakarta Bean Validation规范中,负责非空校验的标准注解是
@NotNull(来自jakarta.validation.constraints.NotNull)。 - 修改代码:将所有
@Nonnull替换为@NotNull,即可触发预期的非空校验:
class Request { @NotNull @Valid val email: Letter? = null } class Letter { @NotNull @Valid val receiver: EmailContact? = null @NotBlank val header: String = "" val plainText: String = "" val htmlContent: String = "" }
额外注意:确保项目已引入正确的Jakarta校验依赖,包括API包jakarta.validation:validation-api和实现包(如Hibernate Validator)。
内容的提问来源于stack exchange,提问作者atom-22
相关产品推荐
相关产品推荐

