我有2个POJO,如下所示:
public class SourceObj {
protected String name;
...
...
10 String objects
protected AddressesSrc addressesSrc;
...
...
getter and setter for all fields
}
public class AddressesSrc {
protected List<AddressSrc> addressSrc;
...
getters and setters
}
public class AddressSrc {
protected String city;
protected List<ContactSrc> contactSrc;
...
getters & setters
}
public class DestObj {
protected String name;
...
...
10 String objects
protected AddressesDest addressesDest;
...
...
getter and setter for all fields
}
public class AddressesDest {
protected List<AddressDest> addressDest;
...
getters and setters
}
public class AddressDest {
protected String city;
protected List<ContactDest> contactDest;
...
getters & setters
}
现在,我具有如下dozer-configuration.xml:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd">
<configuration>
<stop-on-errors>true</stop-on-errors>
<trim-strings>true</trim-strings>
<relationship-type>non-cumulative</relationship-type>
</configuration>
<mapping>
<class-a>SourceObj</class-a>
<class-b>DestObj</class-b>
</mapping>
</mappings>
现在,上面的映射将诸如name之类的字段从SourceObj复制到DestObj,但无法将AddressSrc列表映射到AddressDest列表。同样在Address对象中,有一个Contact对象的列表。
我发现的一个解决方案是编写一个自定义转换器,它将一个一个地复制原始字段值,然后将所有对象从一个列表复制到另一个目标列表。
但是我正在寻找一种解决方案,如果字段名称与原始值相同,则将自动复制它们,并且需要使用其他某种机制来复制列表对象。同样,我有很多嵌套列表对象。
请为这种情况提供解决方案。
推土机将映射任何具有相同名称并自动键入的内容。当您要映射的字段具有不同的名称时,您必须在映射中明确告诉Dozer,哪些字段要相互映射。在上面的问题中,AddressSrc和AddressDest是具有不同名称的字段。因此,您必须明确告知Dozer将这两个字段相互映射。
<mapping>
<class-a>SourceObj</class-a>
<class-b>DestObj</class-b>
<field>
<a>addressesSrc</a>
<b>addressesDest</b>
</field>
</mapping>
您可能需要其他映射说明才能获得最终想要的结果。但是,由于这两个字段具有不同的名称,因此这是您需要让Dozer映射这两个字段所缺少的映射部分。