Я изо всех сил пытаюсь заставить Dozer изгибаться к моему желанию для чего-то, что я чувствую, должно быть довольно простым. У меня есть две подобных модели, между которыми я хочу отобразиться, однако у каждого есть 'более глубокая' иерархия, чем другой, и это вызывает меня проблемы при контакте с наборами. Рассмотрите следующие классы:
Исходные классы:
class Foo {
String id;
NameGroup nameGroup;
// Setters/Getters
}
class NameGroup {
private List names;
// Setters/Getters
}
class Name {
private String nameValue;
// Setters/Getters
}
Целевые классы:
class Bar {
private String barId;
private BarNames barNames;
// Setters/Getters
}
class BarNames {
private List names;
// Setters/Getters
}
Теперь я хотел бы следующие односторонние отображения:
Foo.id -> Bar.barId // Simple enough
Но мне затем нужно:
Foo.nameGroup.names.nameValue -> Bar.barNames.names
Так каждый Name
экземпляр в Foo.nameGroup.names
должен привести к a String
быть добавленным к BarNames.names
список. Действительно ли это возможно?
Это можно легко сделать с помощью Dozer, если класс "Имя" содержит конструктор String.
Цитата из документов Dozer (http://dozer.sourceforge.net/documentation/simpleproperty.html):
Осуществляется закрытие типа данных. автоматически с помощью Dozer mapping Мотор. В настоящее время Dozer поддерживает следующие типы преобразования: (эти все двунаправленные...
...
Строка к Тип Сложный, если Тип Сложный содержит конструктор String
...
Я протестировал его с вашими классами, как было сказано выше (я застрял с той же самой проблемой), и он работает отлично. Вот отображение, которое я использовал:
<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>