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

问题描述 投票:3回答:3

我正在使用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()调用来检查的。有没有办法解决这个问题而不将此规则作为表单级别的自定义约束编写?

java bean-validation hibernate-validator
3个回答
0
投票

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

@DriverLicenseValid注释应该遵循jsr-303规范中的建议,即null值默认有效。所以你不需要改变Owner类。


0
投票

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


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);
© www.soinside.com 2019 - 2024. All rights reserved.