Нетривиальные отображения Dozer - PullRequest
5 голосов
/ 16 декабря 2009

Я изо всех сил пытаюсь заставить Бульдозер подчиниться моей воле к чему-то, что, на мой взгляд, должно быть довольно простым. У меня есть две схожие модели, которые я хочу отобразить, однако у одной из них более «глубокая» иерархия, чем у другой, и это вызывает у меня проблемы при работе с коллекциями. Рассмотрим следующие классы:

Исходные классы:

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. Это возможно?

1 Ответ

5 голосов
/ 04 января 2010

Это легко сделать с помощью Dozer, если ваш класс «Name» содержит конструктор String.

Цитата из документации Dozer (http://dozer.sourceforge.net/documentation/simpleproperty.html):

Тип данных выполняется автоматически по отображению Dozer двигатель. В настоящее время 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>
...