:によってイル
私は2つのクラスを持っているとorg.dozer.Mapperを使用して男性のオブジェクトへの女性のオブジェクトからプロパティを(マッピングしたいhttp://dozer.sourceforge.net/)。
最初のクラスは、次のとおりです。
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;
...
私は、オブジェクトのプロパティのように使用していることを地図のLinkedHashMapと地図の値はArrayListのであるリストです。私はドーザを使用してそれらをマップしようとすると、ハッシュマップ内の値である配列リストは、写真のようなオブジェクトとルックスを持つリストではありません。
Map<String, List<Contact>> contact = new LinkedHashMap<>();
List<Contact> listOfContacts = new ArrayList<>();
Contact contactObj = new Contact();
contactObj.setEmail("[email protected]");
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);
どのように私は男性のオブジェクトのリストにオブジェクトのリストを得ることができますか?
エマニュエル・ヴァレリオ:
最初に、-があるように私はあなたのコードを試みたと私は同じ動作を得ました。
その後、私はB-ヒントと明示的なセットマッピング設定を(見てきたこれについてのドキュメントを以下のように)、私は何が必要です。
最初のケース- 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("[email protected]");
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("[email protected]", 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());
}
}
その結果をここに:
あなたからの完全なコードを取得することができ、私のGitHubリポジトリ。例はJava8、MavenとJunit5で開発されました。
編集:私は、Javaのマッピング設定のケースを追加しました。インスピレーションを取って別のポスト