Отображение глубоких свойств с промежуточными коллекциями в dozer - PullRequest
6 голосов
/ 04 февраля 2010

Предположим, у меня есть следующие классы

public class Baz {
  private List<Foo> foos = new ArrayList<Foo>();
}

public class Foo {
  private String string;
}

public class Target {
  private List<String> fooStrings = new ArrayList<String>();
}

Есть ли какое-либо сопоставление, которое я могу использовать для данного Baz, сопоставить его с целевым классом и получить список строк, содержащихся в foo в Baz? Следующее отображение не работает

<mapping>
  <class-a>Baz</class-a>
  <class-b>Target</class-b>
  <field>
    <a>foos.string</a>
    <b>fooStrings</b>
  </field>
</mapping>

Потому что string не является свойством foos (типа List). Я бы подумал, что Dozer будет достаточно умен, чтобы, если бы он встретил коллекцию в глубоком отображении, а целью была также коллекция, чтобы можно было разбить глубокое имя свойства на два и выполнить итерацию по коллекции, чтобы получить дочернюю часть. глубокого картирования от членов коллекции. Очевидно нет. Есть ли решение, кроме запроса функции Dozer?

Ответы [ 3 ]

1 голос
/ 09 января 2013

Я думаю, вы можете написать такое отображение

<mapping>
  <class-a>Baz</class-a>
  <class-b>Target</class-b>
  <field>
    <a>foos</a>
    <b>fooStrings</b>
  </field>
</mapping>

<custom-converters> 
  <converter type="CustomFooConverter">
    <class-a>
      Foo
    </class-a>
    <class-b>
      String
    </class-b>
  </converter>
</custom-converters>

И реализовать CustomFooConverter, чтобы получить строковое поле foo и вернуть его в виде строки.

Я думаю, что вы можете опубликовать запрос функции для поддержки сопоставления примитивам как

<mapping>
  <class-a>Foo</class-a>
  <class-b>String</class-b>
  <field>
    <a>string</a>
  </field>
</mapping>

в Dozer GitHub

1 голос
/ 04 февраля 2010

Вы всегда можете написать свой собственный CustomConverter .

Имеет смысл, почему Dozer не может справиться с этим, как вы ожидаете, поскольку во время выполнения он не имеет информации о типе List foos и не может гарантировать, что каждый Object в списке на самом деле Foo .

0 голосов
/ 02 июня 2012

Я думаю, что вы можете сделать это без специального конвертера.

Переопределить метод toString () класса Foo, как показано ниже:

@Override
public String toString(){
return this.getString(); //assuming string property has a getter method. if not,write this.string

А теперь следующее отображение:

<mapping>
<class-a>fully qualified name of Baz(with package name)</class-a>
<class-b>same for Target</class-b>
<field>
   <a>foos</a>
   <b>fooStrings</b>
   <a-hint>foo</a-hint>
   <b-hint>java.lang.String</b-hint>
</field>
</mapping>
...