在dozer中如何将值全局初始化为空对象而不是null
例如:
Class Person
{
public Address address;
//getters and setters for address
}
Class Address
{
String addressField1;
String addressField2;
}
类似地,我有对象PersonVO和AddressVO,类似于Person和Address
使用dozer映射值后,如果Person对象中的地址值为null,那么personvo.getAddressVO.getAddressField1()
中的结果将抛出空指针异常,有什么办法可以避免这种情况吗?
如果我使用自定义转换器,那么我最终会采用在自定义转换器中设置值的典型方法,并且会破坏使用推土机的目的。
答案 0 :(得分:0)
如果你可以修改PersonVO
类的setter方法,你可以这样做:
public void setAddressVO(AddressVO address) {
this.addressVO = address == null ? new AddressVO() : address;
}
因此,您将确保字段addressVO
永远不会null
。
请注意,这很脏,因为:
null
而不是一个空的AddressVO
对象。 initAddressVO
并从dozer调用此方法
使用配置文件中的set-method
属性。使用if
检查地址是否为空可能会更好(如果可能)以避免NullPointerException
。
答案 1 :(得分:0)
没有任何非静态数据成员的对象称为空对象,因为所有非静态数据成员都驻留在堆中的对象内。因此,如果我们没有任何非静态数据成员,我们将对象视为空。但不是NULL。
空对象: 没有任何非静态数据成员的对象。
空对象: 没有任何引用的对象,即空引用;
答案 2 :(得分:0)
有一种方法可以在Dozer中初始化目标对象。
举个例子,我猜你想把Person映射到PersonVO,将Address映射到AddressVO。
为PersonVO创建工厂类
public abstract class PersonVOFactory {
private PersonVOFactory() {
}
public static PersonVO createPersonVO() {
PersonVO personVO = new PersonVO();
personVO.setAddressVO(new AddressVO());
return personVO;
}
}
为Person to PersonVO映射指定上述create方法。
<mapping map-id="person-mapping">
<class-a>Person</class-a>
<class-b create-method="PersonVOFactory.createPersonVO">PersonVO</class-b>
<field>
<a>address.addressField1</a>
<b>addressVO.addressField1</b>
</field>
<field>
<a>address.addressField2</a>
<b>addressVO.addressField2</b>
</field>
</mapping>
现在语句personvo.getAddressVO.getAddressField1()
不会抛出NPE。