Bean验证组继承不与Group Sequence Provider一起使用

时间:2014-06-11 17:24:21

标签: java validation inheritance bean-validation hibernate-validator

我目前正致力于实施一个存储包含国内和国内地址的联系信息的应用程序,但地址也可以被禁用。

我试图定义三个验证组:一个用于始终验证信息的超级组和两个用于不同地址状态的子类。

public interface ContactValidation {}
public interface DomesticValidation extends ContactValidation {}
public interface ForeignValidation extends ContactValidation {}

然后我在联系人类上定义了一个@GroupSequenceProvider。

public class ContactGroupSequenceProvider implements DefaultGroupSequenceProvider<Contact> {

@Override
public List<Class<?>> getValidationGroups(Contact contact) {
    List<Class<?>> defaultGroupSequence = new ArrayList<Class<?>>();

    if(contact.getIsForeign()){
        defaultGroupSequence.add(Contact.ForeignValidation.class);
    } else {
        defaultGroupSequence.add(Contact.DomesticValidation.class);
    } //TODO: Add Address Disabled Case

    defaultGroupSequence.add(Contact.class); //Get a GroupDefinitionException without this line

    return defaultGroupSequence;
}

当我使用地址验证运行程序时,标记为groups = Contact.ContactValidation.class的字段即使它是地址验证的超类也未被验证。

我需要此应用程序一起验证,因此使用的不必修复错误,提交并获取新错误。

我也想避免使用经过验证的字段的解决方案。

@NotBlank(groups={DomesticValidation.class,ForeignValidation.class ,ContactValidation.class})   
private String fullContactName;

任何建议表示赞赏!

1 个答案:

答案 0 :(得分:0)

如果您返回其中一个子类,我还希望验证标记为ContactValidation的约束。这似乎是Hibernate Validator中的一个错误,所以你能在我们的issue tracker打开一张票吗?

作为解决方法,您可以尝试将ContactValidation明确添加到您返回的列表中。