【问题标题】:Dozer - empty object instead of nullDozer - 空对象而不是 null
【发布时间】:2012-06-25 11:26:34
【问题描述】:

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

例如:

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

}

Class Address
{
String addressField1;
String addressField2;
}

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

使用推土机映射值后,如果Person对象中的address值为null,那么personvo.getAddressVO.getAddressField1()中的结果会抛出空指针异常,有什么办法可以避免吗? p>

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

【问题讨论】:

    标签: java dozer sourceforge


    【解决方案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 的映射指定上述 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。

    【讨论】:

      【解决方案2】:

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

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

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

      请注意,这很脏,因为:

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

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

      【讨论】:

      • 我有类似的想法,检查 null 的问题是,要访问 personvo.getAddressVO().getAddressField1() 的代码是某个工具生成的代码,我不确定它是否可以选择生成空检查。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-22
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多