Java Bean验证:具有类级别约束的GroupSequence

Hin*_*ton 8 java bean-validation

我有一个bean类,有多个(自定义)内部约束和一个类级别约束.我想在类级别约束之前验证内部约束.代码如下所示:

@GroupSequence({ Inner.class, NewSlotBean.class })
@TotalBeanValid(groups = NewSlotBean.class)
public class NewSlotBean {

    @DayMonthYearString(groups = Inner.class)
    private String slotDay;

    @TimeString(groups = Inner.class)
    private String slotBegin;

    @LengthString(groups = Inner.class)
    private String slotLength;
}
Run Code Online (Sandbox Code Playgroud)

(Inner只是一个位于某处的空接口).

但是,当我尝试运行它时,类级别约束根本没有得到验证.当我尝试定义GroupSequence时

@GroupSequence({ Inner.class, Outer.class })
Run Code Online (Sandbox Code Playgroud)

(Outer作为随机接口),我得到了例外:

javax.validation.GroupDefinitionException: ...*.beans.NewSlotBean must be part of the redefined default group sequence.
Run Code Online (Sandbox Code Playgroud)

s/o是否知道如何确保在内部约束之后验证类级别约束?(这似乎不是默认的!我有一段时间后突然出现的随机问题.)

Har*_*rdy 11

试试这个:

@GroupSequence({ Inner.class, NewSlotBean.class })
@TotalBeanValid(groups = Default.class)
public class NewSlotBean {

    @DayMonthYearString(groups = Inner.class)
    private String slotDay;

    @TimeString(groups = Inner.class)
    private String slotBegin;

    @LengthString(groups = Inner.class)
    private String slotLength;
}
Run Code Online (Sandbox Code Playgroud)

根据规范,NewSlotBean只是默认组的替身.另请参见Bean Validation规范的第3.4.3节:

由于序列不能具有循环依赖性,因此在序列声明中使用Default不是一种选择.托管在类A上并且属于默认组的约束(默认或显式)隐式属于组A.

在类A上定义的序列(即重新定义类的默认组)必须包含组A.换句话说,类上托管的默认约束必须是序列定义的一部分.如果重新定义类A的默认组的@GroupSequence不包含组A,则在Constraint声明和验证过程验证类或请求其元数据时会引发GroupDefinitionException.

  • 只是对一个很好的答案的改进建议:最好以相反的方式对验证进行分组:`NewSlotBean`上的`@GroupSequence({ NewSlotBean.class, ClassLevel.class }) @TotalBeanValid(groups = ClassLevel.class)`类,然后删除 `InnerGroup` 验证组和字段级别组分配 - 字段验证会自动分配给默认验证组。更少的代码,更干净。 (2认同)