gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:53 27 4
gpt4 key购买 nike

我有两个类,想使用 org.dozer.Mapper( http://dozer.sourceforge.net/ ) 将 Female 对象的属性映射到 Male 对象。

第一类是:

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

private Map<String, List<Contact>> contacts;
....

第二类是:

public class Female {
private String name;
private String surname;
private String mobile;
private String dateOfBirth;

private Map<String, List<Contact>> contacts;
...

第三类是:

public class Contact {
private String street;
private String postcode;
private String email;
...

我像对象属性一样使用的 Map 是 LinkedHashMap,作为 Map 中的值的 List 是 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);

enter image description here

如何获取Male对象中List中的对象列表?

最佳答案

起初,我按原样尝试了您的代码,我得到了相同的行为。

然后,我已经使用 b-hint(参见 documentation about this)显式设置映射配置,如下所示,我得到了您需要的。

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

public class CustomMapper extends BeanMappingBuilder {
@Override
protected void configure() {
mapping(Female.class, Male.class).fields("contacts", "contacts", FieldsMappingOptions.hintB(Contact.class));
}
}

第二种情况——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>

这里是我执行的单元测试:

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());
}
}

结果如下:


enter image description here

您可以从my GitHub repository 获得完整的代码.该示例是使用 Java8、Maven 和 Junit5 开发的。

编辑:我添加了 Java 映射配置案例。从 another post 中汲取灵感

关于java - 如何使用 DozerBeanMapper 将具有对象数组列表的 HashMap(列表是 HashMap 中的值)映射到另一个 HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57048557/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com