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

Spring Boot中@Size(min)为何在空字段触发?如何让@NotBlank优先验证?

Jakarta Validation中@NotBlank与@Size的执行顺序问题

为什么空字段会触发@Size(min=2)验证?

Jakarta Validation的默认策略是并行执行所有字段约束,不会因某一约束失败就终止后续验证:

  • @NotBlank的作用是确保字符串不为null、不为空字符串且非全空白字符,空字符串会触发该约束失败。
  • @Size的验证逻辑是只要字段值不为null,就会计算其长度并校验范围。空字符串不是null,长度为0,自然不符合min=2的要求,因此会同时触发@Size的错误。

如何确保@NotBlank优先执行,空字段时不触发@Size?

最直接的方案是使用验证分组+分组顺序控制约束执行顺序,具体步骤如下:

  1. 定义两个空接口作为验证分组:
public interface BasicCheck {}
public interface DetailCheck {}
  1. 在实体类上通过@GroupSequence指定验证顺序,要求先执行基础校验(BasicCheck),通过后再执行细节校验(DetailCheck):
import jakarta.validation.GroupSequence;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

@GroupSequence({BasicCheck.class, DetailCheck.class, User.class})
public class User {
    @NotBlank(message = "Name is required", groups = BasicCheck.class)
    @Size(min = 2, max = 50, message = "Name must be between 2 and 50 characters", groups = DetailCheck.class)
    private String name;

    // 其他字段、getter和setter方法
}
  1. 在Spring Boot验证逻辑中,使用@Valid或@Validated时,默认会遵循@GroupSequence定义的顺序;若需显式指定分组,可使用@Validated({BasicCheck.class, DetailCheck.class})。

配置完成后,传入空字符串时只会触发BasicCheck分组下的@NotBlank错误,只有当@NotBlank验证通过(字符串非空且非空白),才会执行@Size的长度校验。

内容的提问来源于stack exchange,提问作者Ali Zain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:56:02