Java Bean Validation使用校验分组时级联校验不生效如何解决?
你当前的配置存在三个核心问题:
@Valid级联校验的分组传递逻辑不匹配:默认@Valid级联校验时,只会校验级联对象中与当前触发分组匹配的规则,你将Bar类的所有字段校验规则都绑定到了BarValidationGroup分组,但没有配置级联时的分组映射,导致对应规则无法被触发。@GroupSequence的作用范围理解错误:你在Foo类上配置的@GroupSequence({Foo.class, BarValidationGroup.class})只会约束Foo类自身校验规则的执行顺序,不会自动将级联对象的校验分组纳入链路。- 隐藏校验逻辑前提:分组序列规则要求前序分组所有校验全部通过才会执行后续分组校验,你的
ConstraintValidator要确保校验通过时返回true,才会触发Bar相关的校验逻辑,你提到第一层校验可以触发,大概率已经满足该前提。
修复方案
只需要在Foo类的someBar字段上新增@ConvertGroup注解,完成默认分组到Bar校验分组的转换即可,修改后的完整代码如下:
// 校验分组标记接口保持不变 public interface BarValidationGroup {} @SomeClassValidation @GroupSequence({Foo.class, BarValidationGroup.class}) class Foo { String someField; @Valid // 新增分组转换配置:当触发Default分组校验时,级联校验Bar对象的BarValidationGroup分组规则 @ConvertGroup(from = Default.class, to = BarValidationGroup.class) Bar someBar; } class Bar { @NotEmpty @Size(min=2, max=2, groups = BarValidationGroup.class) String fieldA; @NotEmpty @Size(min=3, max=10, groups = BarValidationGroup.class) String fieldB; }
校验逻辑执行说明
配置完成后执行校验时,如果你传入的校验分组为Default(也就是Spring等大多数框架默认的调用方式),会按照如下顺序执行:
- 先执行
@SomeClassValidation的类级别校验,若校验失败直接返回错误,不执行后续逻辑 - 类级别校验通过后,触发
BarValidationGroup分组的校验,自动级联校验Bar类中所有归属该分组的字段规则
内容的提问来源于stack exchange,提问作者niverg
相关产品推荐
相关产品推荐

