【问题标题】:How to instantiate a subclass with Dozer?如何用 Dozer 实例化一个子类?
【发布时间】:2014-01-28 23:12:09
【问题描述】:

我有以下 target 类:

public class Person {
    private String firstName;
    private String lastName;
    ...
}

public class Employee extends Person {
    private String postion;
    ...
}

public class PersonContainer {
   private Person person;
   ...
}

这是我的来源:

public class Form {
    private String firstNameEmployee;
    private String lastNameEmployee;
    private String positionEmployee;
    ...
}


目标

我想获得对象 PersonContainer 但不是用 Person 对象而是用 Employee 对象。我真的不知道如何实现这一目标。如何告诉 Dozer 实例化一个子类?

这个映射给出了Person对象:

 <mapping>
    <class-a>hl.test.dozer03.form.Form</class-a>
    <class-b>hl.test.dozer03.result.PersonContainer</class-b>


    <field>
        <a>firstNameEmployee</a>
        <b>person.firstName</b>
    </field>

    <field>
        <a>lastNameEmployee</a>
        <b>person.lastName</b>
    </field>

 </mapping>


可以通过稍微修改这个映射来完成吗?

【问题讨论】:

    标签: java dozer


    【解决方案1】:

    您需要使用自定义创建方法。 http://dozer.sourceforge.net/documentation/customCreateMethod.html

    类似这样的:

    <mapping>
      <class-a>hl.test.dozer03.form.Form</class-a>
      <class-b create- method="PersonContainerFactory.createPersonContainer">hl.test.dozer03.result.PersonContainer</class-b>
    
    
      <field>
        <a>firstNameEmployee</a>
        <b>person.firstName</b>
      </field>
    
      <field>
        <a>lastNameEmployee</a>
        <b>person.lastName</b>
      </field>
    
    </mapping>
    

    使用java类:

    public class PersonContainerFactory {
    
      public static PersonContainer createPersonContainer(){
          PersonContainer cont = new PersonContainer();
          cont.setPerson(new Employee());
          return classA;
      }
    }
    

    【讨论】:

    • 是的,效果很好。只有一件事:你知道如何为 Employee.position 设置值吗? person.position 不起作用,因为 PersonContainer.person 字段的类型是 Person。
    • 您可以在字段映射上使用自定义转换器执行类似的操作。 field1field2 如果目标对象是员工,则让 CustomConverter 计算出来,如果是,则进行转换并设置值。 dozer.sourceforge.net/documentation/customconverter.html
    【解决方案2】:

    尝试将 Person 类字段更改为受保护,以便可以继承它们

    public class Person {
        protected String firstName;
        protected String lastName;
        ...
    }
    

    从 PersonContainer 更改为(你想要的)

    public class EmployeeContainer {
       private Employee employee;
       ...
    }
    

    希望对你有帮助

    【讨论】:

    • 不幸的是,从 PersonContainer 更改为 EmployeeContainer 不是办法。这是更复杂问题的简单示例。这里主要是实例化子类Employee,放到超类字段中。
    猜你喜欢
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多