推土机 - 空对象而不是空

时间:2012-06-25 11:26:35

标签: java dozer sourceforge

在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()中的结果将抛出空指针异常,有什么办法可以避免这种情况吗?

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

3 个答案:

答案 0 :(得分:0)

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

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

因此,您将确保字段addressVO永远不会null

请注意,这很脏,因为:

  1. 如果某人没有地址,他的地址字段应为null 而不是一个空的AddressVO对象。
  2. 一个定制的二传手 这是一种不好的做法,因为你们班级的大多数用户都希望这样做 set方法设置值,不做任何其他事情。你可以选择 创建一个新方法initAddressVO并从dozer调用此方法 使用配置文件中的set-method属性。
  3. 使用if检查地址是否为空可能会更好(如果可能)以避免NullPointerException

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

  1. 为目标对象定义工厂类。
  2. 指定目标对象的create-method作为上述工厂类中的方法。
  3. 举个例子,我猜你想把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。