JSR-303如何以不同方式验证两个子对象

时间:2013-04-16 13:43:09

标签: java bean-validation hibernate-validator

我正在使用Hibernate Validator作为JSR-303实现。

假设我有:

class Form {
    @Valid
    private Owner mainOwner;
    @Valid
    private Owner secondOwner;
    // ... many other fields
}

class Owner {
    @DriverLicenseValid // some custom validation
    private String driverLicense;
    // ... many other fields
}

// ...

Form myForm;
validator.validate(myForm);

看,我想验证整个表单,它包含两个类似Owner的类似子对象。问题是,对于mainOwner,driverLicense应该是@NotNull,而对于secondOwner,它应该是@Null。

我不能在这里使用组(可以吗?)因为整个模型都是通过一次validate()调用来检查的。有没有办法解决这个问题而不将此规则写为表单级别的自定义约束?

3 个答案:

答案 0 :(得分:0)

mainOwner中的Form字段上创建验证注释,验证Owner实例是否具有设置的驱动程序许可证。

@DriverLicenseValid注释应该遵循jsr-303规范中的建议,null值默认有效。因此,您无需更改Owner类。

答案 1 :(得分:0)

如果您使用Hibernate Validator 4.x,则可以使用自定义组序列提供程序,如forum post中所述。

答案 2 :(得分:0)

使用组:

class Form {
    @Valid
    @ConvertGroup(from=Default.class, to=NotNullDriversLicense.class)
    private Owner mainOwner;
    @Valid
    @ConvertGroup(from=Default.class, to=NullDriversLicense.class)
    private Owner secondOwner;
    // ... many other fields
}

class Owner {
    @Null(groups = NullDriversLicense.class)
    @NotNull(groups = NotNullDriversLicense.class)
    private String driverLicense;
    // ... many other fields
}

interface NullDriversLicense {}
interface NotNullDriversLicense {}

// ...

Form myForm;
validator.validate(myForm);