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?
最直接的方案是使用验证分组+分组顺序控制约束执行顺序,具体步骤如下:
- 定义两个空接口作为验证分组:
public interface BasicCheck {} public interface DetailCheck {}
- 在实体类上通过
@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方法 }
- 在Spring Boot验证逻辑中,使用
@Valid或@Validated时,默认会遵循@GroupSequence定义的顺序;若需显式指定分组,可使用@Validated({BasicCheck.class, DetailCheck.class})。
配置完成后,传入空字符串时只会触发BasicCheck分组下的@NotBlank错误,只有当@NotBlank验证通过(字符串非空且非空白),才会执行@Size的长度校验。
内容的提问来源于stack exchange,提问作者Ali Zain
相关产品推荐
相关产品推荐

