2014-04-22 134 views
0

我有一个场景是类似于以下两类:推土机 - 映射集合

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

Person类是我的源类。我试图用多佛这个类映射到以下目标类:

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文件中的基元,但我无法映射集合。

任何想法如何使用推土机将Person的对象映射到PersonPrime类型的对象?

+0

恕我直言,你将需要使用自定义转换器http://dozer.sourceforge.net/documentation/customconverter.html – Hirak

回答

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>

1

默认情况下,JAXB没有了“FamilyMembers”类型中生成集合制定者。当Dozer尝试调用不存在的setter时,这会在Dozer的内部深处产生空指针(Dozer 5.4.0中的org.dozer.util.ReflectionUtils.java:323)。为了避免这种情况,您需要在收集字段上设置为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

感谢,加入'是可访问=“真“JAXB收集方面的工作如预期般进行。但是您可能应该考虑将JAXBBeanFactory用于JAXB类,因为如果没有它,某些事情可能会出错。为此请添加' ...' – Thomas