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