推土机 - 映射集合

时间:2014-04-22 09:19:47

标签: java jaxb dozer

我有一个类似于以下两个类的场景:

public class Person {
    private String name;
    private Set<Person> familyMembers;
    //constructors & getters and setters
}

Person类是我的源类。我正在尝试使用Dover将此类映射到以下目标类:

public class PersonPrime {
    private String personName;
    private FamilyMembers familyMembers;
    //constructors & getters and setters
}

public class FamilyMembers {
    private List<PersonPrime> familyMembers;
    //constructors & getters and setters
}

我的实际场景中的目标类是由JAXB生成的(使用我创建的XSD)。 XSD是规定的,我无法真正改变它们,因此目标类不能改变。我目前能够在映射XML文件中映射基元,但我无法映射集合。

知道我如何使用Dozer将Person的对象映射到PersonPrime类型的对象?

2 个答案:

答案 0 :(得分:1)

默认情况下,JaxB不会为“FamilyMembers”类型中的集合生成setter。当Dozer试图调用不存在的setter时,这将导致在Dozer(orzer.dozer.util.ReflectionUtils.java:323,Dozer 5.4.0)的内部深处出现空指针异常。要避免这种情况,您需要在集合字段上设置is-accessible true,这将使其直接设置familyMembers.familyMembers字段。因此,以下修改后的映射应该工作:

<mapping>
  <class-a>Person</class-a>
  <class-b>PersonPrime</class-b>
  <field>
    <a>name</a>
    <b>personName</b>
  </field>
  <field>
    <a>familyMembers</a>
    <b is-accessible="true">familyMembers.familyMembers</b>
  </field>
</mapping>

答案 1 :(得分:0)

以下映射有效。

<mapping> <class-a>Person</class-a> <class-b>PersonPrime</class-b> <field> <a>name</a> <b>personName</b> </field> <field> <a>familyMembers</a> <b>familyMembers.familyMembers</b> </field> </mapping>