Java 如何使用DozerBeanMapper将具有对象数组列表的HashMap(列表是HashMap中的值)映射到另一个HashMap?

Java 如何使用DozerBeanMapper将具有对象数组列表的HashMap(列表是HashMap中的值)映射到另一个HashMap?,java,mapping,dozer,Java,Mapping,Dozer,我有两个类,希望使用org.dozer.Mapper()将属性从女性对象映射到男性对象 第一类是: public class Male { private String name; private String surname; private Map<String, List<Contact>> contacts; .... 我使用的like object属性的映射是LinkedHashMap,映射中的值列表是ArrayList。 当我尝试使

我有两个类,希望使用org.dozer.Mapper()将属性从女性对象映射到男性对象

第一类是:

public class Male {
    private String name;
    private String surname;

    private Map<String, List<Contact>> contacts;
....
我使用的like object属性的映射是LinkedHashMap,映射中的值列表是ArrayList。 当我尝试使用推土机映射它们时,哈希映射中的值数组列表不是包含对象的列表,如图所示:

        Map<String, List<Contact>> contact = new LinkedHashMap<>();
        List<Contact> listOfContacts = new ArrayList<>();
        Contact contactObj = new Contact();
        contactObj.setEmail("lala@gmail.com");
        contactObj.setPostcode("1233355");
        contactObj.setStreet("street");

        listOfContacts.add(contactObj);

        contact.put("2131323213", listOfContacts);
        femaleObj.setContact(contact);

        Mapper objectMapper = new DozerBeanMapper();
        Male maleObj = objectMapper.map(femaleObj, Male.class);
Map contact=newlinkedhashmap();
List-listOfContacts=new-ArrayList();
触点OBJ=新触点();
contactObj.setEmail(“lala@gmail.com");
contactObj.setPostcode(“1233355”);
contactObj.setStreet(“街道”);
Contacts.add列表(contactObj);
联系方式(“21313213”,联系人列表);
femaleObj.setContact(触点);
Mapper objectMapper=new DozerBeanMapper();
Male maleObj=objectMapper.map(femaleObj,Male.class);


如何获取男性对象列表中的对象列表?

首先,我按原样尝试了您的代码,得到了相同的行为

然后,我用b-hint显式地设置了映射配置(请参见),如下所示,我得到了您需要的

第一种情况-Java配置(创建扩展BeanMappingBuilder的类):

第二种情况-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>
    <wildcard>true</wildcard>
  </configuration>

  <mapping>
    <class-a>blog.valerioemanuele.dozer.Female</class-a>
    <class-b>blog.valerioemanuele.dozer.Male</class-b>

      <field>
        <a>contacts</a>
        <b>contacts</b>
        <b-hint>blog.valerioemanuele.dozer.Contact</b-hint> 
      </field>
  </mapping> 


</mappings>

真的
真的
blog.valerioemanuele.dozer.Female
blog.valerioemanuele.dozer.Male

您可以从中获取完整的代码。该示例是使用Java8、Maven和Junit5开发的。


编辑:我添加了Java映射配置案例。从

中汲取灵感,如果您想用JAVA代码而不是XML配置实现同样的效果,请使用以下方法:

public class DemoProvider extends BeanMappingBuilder {

    @Override
    protected void configure() {
        mapping(Female.class, Male.class,
                TypeMappingOptions.oneWay()
        )
                .fields("contact", "contact",
                        FieldsMappingOptions.collectionStrategy(true, RelationshipType.NON_CUMULATIVE),
                        FieldsMappingOptions.hintA(Contact.class),
                        FieldsMappingOptions.hintB(Contact.class),
                        FieldsMappingOptions.oneWay()
                );
      }

}
用法:

DemoProvider demoProvider = new DemoProvider();
DozerBeanMapper objectMapper = new DozerBeanMapper();
objectMapper.addMapping(demoProvider);
Male maleObj = objectMapper.map(femaleObj, Male.class);

这是一个非常模糊的问题。您仅显示通过
Male-maleObj=objectMapper.map(femaleObj,Male.class)将
female映射到
Male
但不显示如何完成;此外,您发布的代码中没有出现
LinkedHashMap
ArrayList
。我已经编辑了代码,以便您可以查看,那么您的问题是什么?如何在男性对象的列表中获取对象列表-这没有什么意义对象列表(来自Contact类的实例)在我的男性对象中没有正确映射。你可以从我贴的照片上看到。
<?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>
    <wildcard>true</wildcard>
  </configuration>

  <mapping>
    <class-a>blog.valerioemanuele.dozer.Female</class-a>
    <class-b>blog.valerioemanuele.dozer.Male</class-b>

      <field>
        <a>contacts</a>
        <b>contacts</b>
        <b-hint>blog.valerioemanuele.dozer.Contact</b-hint> 
      </field>
  </mapping> 


</mappings>
import org.dozer.DozerBeanMapper;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

class TestFemaleToMaleConversion {

    private static Female femaleObj;

    @BeforeAll
    private static void initData() {
        Map<String, List<Contact>> contact = new LinkedHashMap<>();
        List<Contact> listOfContacts = new ArrayList<>();
        Contact contactObj = new Contact();
        contactObj.setEmail("lala@gmail.com");
        contactObj.setPostcode("1233355");
        contactObj.setStreet("street");

        listOfContacts.add(contactObj);

        contact.put("2131323213", listOfContacts);
        femaleObj = new Female();
        femaleObj.setName("Elisabeth");
        femaleObj.setSurname("Chesny");
        femaleObj.setContacts(contact);
    }

    @Test
    void testWithXmlMapping() {
        DozerBeanMapper objectMapper = new DozerBeanMapper();
        objectMapper.setMappingFiles(Arrays.asList("dozer-mapping.xml"));
        Male maleObj = objectMapper.map(femaleObj, Male.class);

        Assert.assertEquals("lala@gmail.com", maleObj.getContacts().get("2131323213").get(0).getEmail());
    }

    @Test
    void testWithJavaMapping() {
        DozerBeanMapper objectMapper = new DozerBeanMapper();
        objectMapper.addMapping(new CustomMapper());
        Male maleObj = objectMapper.map(femaleObj, Male.class);

        Assert.assertEquals("street", maleObj.getContacts().get("2131323213").get(0).getStreet());
    }
}
public class DemoProvider extends BeanMappingBuilder {

    @Override
    protected void configure() {
        mapping(Female.class, Male.class,
                TypeMappingOptions.oneWay()
        )
                .fields("contact", "contact",
                        FieldsMappingOptions.collectionStrategy(true, RelationshipType.NON_CUMULATIVE),
                        FieldsMappingOptions.hintA(Contact.class),
                        FieldsMappingOptions.hintB(Contact.class),
                        FieldsMappingOptions.oneWay()
                );
      }

}
DemoProvider demoProvider = new DemoProvider();
DozerBeanMapper objectMapper = new DozerBeanMapper();
objectMapper.addMapping(demoProvider);
Male maleObj = objectMapper.map(femaleObj, Male.class);