2

在推土机中,我如何将值全局初始化为空对象而不是 null

例如:

Class Person
{
public Address address;
//getters and setters for address

}

Class Address
{
String addressField1;
String addressField2;
}

同样,我有类似于 Person 和 Address 的对象 PersonVO 和 AddressVO

使用推土机映射值后,如果Person对象中的地址值为null,则结果personvo.getAddressVO.getAddressField1()将抛出空指针异常,有什么办法可以避免这种情况?

如果我使用自定义转换器,那么我最终会以典型的方式在自定义转换器中设置值,并且会破坏使用推土机的目的。

4

3 回答 3

1

有一种方法可以在 Dozer 中初始化目标对象。

  1. 为目标对象定义一个工厂类。
  2. 将目标对象的创建方法指定为上述工厂类中的方法。

以您的示例为例,我假设您想将 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 到 PersonVO 的映射指定上述创建方法。

<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。

于 2016-04-26T12:39:48.530 回答
0

如果你可以修改PersonVO类的setter方法,你可以这样做:

public void setAddressVO(AddressVO address) {
    this.addressVO = address == null ? new AddressVO() : address;
}

因此,您将确定该字段addressVO是 never null

请注意,这很脏,因为:

  1. 如果一个人没有地址,他的地址字段应该是null 而不是一个空AddressVO对象。
  2. 像这样的自定义设置器是一种不好的做法,因为您的类的大多数用户都希望 set 方法设置值并且什么都不做。您可以选择创建一个新方法,并使用配置文件中的属性initAddressVO从推土机调用此方法。set-method

最好(如果可能的话)用一些检查地址是否为空if以避免NullPointerException.

于 2012-06-27T07:53:40.610 回答
0

没有任何非静态数据成员的对象称为空对象,因为所有非静态数据成员都驻留在堆中的对象内。因此,如果我们没有任何非静态数据成员,我们的对象为空。但不是 NULL。

空对象:没有任何非静态数据成员的对象。

空对象:没有任何引用的对象,即空引用;

于 2013-09-28T18:08:39.140 回答