Spring MVC表单支持对象树初始化的最佳实践
问题内容:
如果我有一个具有复杂对象树的支持表单的对象-比如说一个具有联系信息对象的人,该对象具有一个带有一串字符串的Address对象-
似乎该对象需要完全填充组件对象才能绑定到它。因此,如果要创建一个新的Person,则需要确保所有组件对象均已填充,如果要从数据库中检索Person,则需要确保没有从数据库中填充空对象。
当然,第一个问题-
我的上述假设正确吗?看来,如果我尝试绑定到person.contactInfo.homeAddress.street,并且没有ContactInfo,则会得到一个空指针异常。
其次,初始化对象的最佳方法是什么。我可以想到几种方法。一种是在声明时初始化所有成员对象:
public class Person {
String name;
ContactInfo contactInfo = new ContactInfo();
//getters, setters, etc.
}
public class ContactInfo {
String phone;
Address homeAddress = new Address();
}
等等。
另一种方法是让PersonFactory初始化所有内容(或让工厂方法Person.getInstance初始化所有内容)。
在从数据库中检索Person的情况下,第一种方法将解决问题(即,如果该特定Person在数据库中没有地址,则该对象仍将具有Address),但这将意味着创建每个对象两次。除了使DAO显式填充所有内容(即使没有从数据库中检索到任何内容)之外,也不知道如何处理此问题。或者为工厂提供一种方法来遍历对象并“填充”所有缺失的东西。
有什么建议吗?
问题答案:
如果愿意,可以称其为过大杀伤力,但是实际上最终要做的是创建一个通用工厂,该工厂将接收任何对象并使用反射(递归地)查找所有null属性并实例化正确类型的对象。我使用Apache
Commons BeanUtils完成此操作。
这样,您可以获取可能是从各种来源(DAO,从XML反序列化,等等)获得的对象,将其通过此工厂,然后将其用作表单支持对象,而不必担心可能需要绑定某些内容为空。
诚然,这意味着实例化我们可能不需要给定形式的属性,但是在我们的情况下通常不适用。