Нетривиальные опоры тушеной голубы
Вопрос
Я изо всех сил пытаюсь получить Бульдозер Наклониться моей воле за то, что я чувствую, должно быть довольно простым. У меня есть две подобные модели, которые я хочу сопоставить между ними, однако у одной есть «более глубокая» иерархия, чем другая, и это вызывает у меня проблемы при работе с коллекциями. Рассмотрим следующие классы:
Исходные классы:
class Foo {
String id;
NameGroup nameGroup;
// Setters/Getters
}
class NameGroup {
private List<Name> names;
// Setters/Getters
}
class Name {
private String nameValue;
// Setters/Getters
}
Занятия назначения:
class Bar {
private String barId;
private BarNames barNames;
// Setters/Getters
}
class BarNames {
private List<String> names;
// Setters/Getters
}
Теперь я хотел бы следующие односторонние отображения:
Foo.id -> Bar.barId // Simple enough
Но тогда мне нужно:
Foo.nameGroup.names.nameValue -> Bar.barNames.names
Итак, каждый Name
экземпляр в Foo.nameGroup.names
должен привести к String
добавлять в BarNames.names
список. Это возможно?
Решение
Это можно легко сделать с помощью Dozer, если ваш класс «Имя» содержит строковый конструктор.
Цитата из Dozer Docs (http://dozer.sourceforge.net/documentation/simpleproperty.html):
Обложка типа данных выполняется автоматически двигателем картирования Doozer. В настоящее время Dozer поддерживает следующие типы конверсий: (все они двунаправленные)
...
Строка к комплексному типу, если комплексный тип содержит строковый конструктор
...
Я проверил это с вашими занятиями, как указано выше (я застрял с той же проблемой), и это работает отлично. Вот картирование, которое я использовал:
<mapping>
<class-a>com.test.bar.Bar</class-a>
<class-b>com.test.foo.Foo</class-b>
<field>
<a>barId</a>
<b>id</b>
</field>
<field>
<a>barNames.names</a>
<b>nameGroup.names</b>
<a-deep-index-hint>java.lang.String</a-deep-index-hint>
<b-deep-index-hint>com.test.foo.Name</b-deep-index-hint>
</field>
</mapping>