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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:07:06