假设我有一个班级Address
,它是Contact
和Vendor
班级的孩子。在Contact
的情况下,企业只关心地址的 City 字段(联系人更多关于此人的姓名和电话及其位置 - 城市)。然而,对于可能从我们这里收到纸质邮件的Vendor
,我们需要完整的地址信息,因此 Line1 , City ,州/省< / em>,国家, PostalCode / Zip 都是必需的。
我的想法是在 City 字段上创建一个使用ContactAddress
的{{1}},然后使用{{1来创建用@NotBlank
装饰更多字段的子类VendorAddress
}}。
我不确定这是最好的方法(它使我的域对象和Hibernate映射变得复杂)。有没有人有正确的模式提示?
编辑:进一步的细节
@NotBlank
public class Contact {
private Address address;
}
public class Vendor {
private Address address;
}
public class Address {
private String line1;
@NotBlank
private String city;
private String state;
private String country;
private String postalCode;
}
然后, City 上只能有Address
,因为并非所有地址的使用都需要其他字段。
我还应该说,我想在JSF中使用这些类(除了在我的服务层中手动调用它之外,它还可以执行“免费验证”)。这是一个“传统的”JSF / Spring / Hibernate应用程序。
也许我想使用http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html_single/#chapter-groups?不确定这与JSF的“免费”验证如何相互作用
答案 0 :(得分:2)
在我看来,您应该将持有数据的关注与验证数据分开 - 因为后者是特定于上下文的。您可能希望将一些“核心”验证放入Address
,但随后将其他验证器分成ContactAddressValidator
和VendorAddressValidator
类(可能实现某种Validator<T>
接口)。
这与您以不同方式对相同类型进行排序的方法相同,为同一Comparator<T>
多次实施T
,但在不同的类中。
答案 1 :(得分:0)
如果其他人发现这一点,我想提供我自己的答案。我最终想到的,并且它适用于我的情况,确实,验证组就是你如何做到的。
这是一篇优秀的博文http://www.jroller.com/eyallupu/entry/jsr_303_beans_validation_using
至于它如何与JSF的验证交互,有一个f:validateBean标记,可以让你控制它。