在 Bean Validation 中使用组的想法是什么

What is the idea of using groups in Bean Validation

简而言之,使用组的想法是什么? 例如,class 定义现在没有组。如果我们启用以下群组,会有什么变化?

//  @Size(min = 4, max = 30, groups = LengthGroup.class)
    @Size(min = 4, max = 30)
    private String name;

//  @Size(min = 12, max = 120, groups = LengthGroup.class)
    @Size(min = 12, max = 120)
    private String address;

//  @Size(min = 5, max = 30, groups = LengthGroup.class)
    @Size(min = 5, max = 30)
    @EmailAddress//(groups = EmailGroup.class)
    private String email;

p.s。这些组也有两个相应的接口

对具有不同属性的同一目标多次声明同一约束通常很有用。这就是该小组的目的。考虑这个例子:

public class Address {
    @ZipCode.List( {
            @ZipCode(countryCode="fr", groups=Default.class
                     message = "zip code is not valid"),
            @ZipCode(countryCode="fr", groups=SuperUser.class
                     message = "zip code invalid. Requires overriding before saving.")
            } )
    private String zipcode;
}

在此示例中,两个约束都适用于邮政编码字段,但具有不同的组和不同的错误消息。

示例取自 here

除了kocko所说的,它们也是为了对验证规则进行分类。引用自 JSR-303 final spec:

Groups allow you to restrict the set of constraints applied during validation.

如果您重新添加上述组并像这样调用验证器:validator.validate(user, LengthGroup.class);,将只验证您字段的长度。这意味着不考虑 @EmailAddress 约束。

如果您这样调用验证器:validator.validate(user, LengthGroup.class, EmailGroup.class);,您的所有约束都将被验证。

更适合此功能的用例是验证具有联系数据的用户版本和没有联系数据的用户版本。考虑以下示例:

@Size(min = 4, max = 30)
private String name;

@Size(min = 12, max = 120, groups=WithContactInfo.class)
private String address;

@Size(min = 5, max = 30, groups= WithContactInfo.class)
@EmailAddress(groups = WithContactInfo.class)
private String email;

现在您可以验证不需要联系信息的用户 validator.validate(user),以及需要联系信息的用户 validator.validate(user, WithContactInfo.class)