Dozer Mapper не отображается, несмотря на то, что поля имеют одинаковые имена и указаны XML отображений - PullRequest
0 голосов
/ 05 февраля 2020

Предположим, у меня есть:

  1. ObjectWithList , ListWrapper и ObjectWithWrapper классы, подобные этим:
//com.github.komidawi.ObjectWithList
public class ObjectWithList {
    private List<String> list;
    // ...
}

//com.github.komidawi.ListWrapper 
public class ListWrapper {
    private List<String> wrappedList;
    // ...
}

//com.github.komidawi.ObjectWithWrapper
public class ObjectWithWrapper {
    private ListWrapper list;
    // ...
}

MyCustomConverter класс, чтобы обернуть / развернуть эти списки.

mapperConfiguration. xml файл конфигурации

<!-- ... -->
<configuration>
    <stop-on-errors>true</stop-on-errors>
    <wildcard>true</wildcard>

    <custom-converters>
        <converter type="com.github.komidawi.MyCustomConverter">
            <class-a>com.github.komidawi.ListWrapper</class-a>
            <class-b>java.util.List</class-b>
        </converter>
    </custom-converters>
</converter>

<mapping>
        <class-a>com.github.komidawi.ObjectWithList</class-a>
        <class-b>com.github.komidawi.ObjectWithWrapper</class-b>
</mapping>

И я хочу сопоставить ObjectWithWrapper с ObjectWithList :

// ... creating objects
ObjectWithList objectWithList = mapper.map(objectWithWrapper, ObjectWithList.class);
objectWithList.getList(); // This is null

К сожалению, после сопоставления список поле objectWithList равно ноль . Я использовал отладчик, и Dozer даже не вводит MyCustomConverter в этом случае.

Удивительно, но отображение в разных направлениях работает нормально:

ObjectWithWrapper objecthWithWrapper = mapper.map(objectWithList, ObjectWithWrapper.class);
objecthWithWrapper.getList(); // This is not null

Подведение итогов :

  1. Имя поля одинаково как в ObjectWithList и ObjectWithWrapper : список
  2. Я указал пользовательский конвертер для Java List и ListWrapper в xml file
  3. Я указал отображение между ObjectWithList и ObjectWithWrapper в xml файле
  4. В обоих случаях Dozer говорит: "Успешно загруженные пользовательские xml сопоставления из URL"
  5. При сопоставлении из ObjectWithList до ObjectWithWrapper он отлично работает

И проблема:

После сопоставления objectWithList имеет null вместо фактического списка. Я заметил, что он даже не входит MyCustomConverter

1 Ответ

0 голосов
/ 07 февраля 2020

Коллекции особенные, а стирание типов делает их более сложными. Если все, что вам нужно, это чтобы элементы в wrappedList были в списке в результирующем экземпляре ObjectWithList, это можно сделать без конвертера. Dozer будет обрабатывать сопоставление вложенных свойств, поэтому вы можете описать сопоставление таким образом, чтобы Dozer отображал списки друг на друга.

new BeanMappingBuilder() {
    configure() {
        mapping(ObjectWithList.class, ObjectWithWrapper.class,
            .fields("list.wrappedList", "list")
    }
}

или XML

<mapping>
        <class-a>com.github.komidawi.ObjectWithList</class-a>
        <class-b>com.github.komidawi.ObjectWithWrapper</class-b>
        <field>
            <a>list.wrappedList</a>
            <b>list</b>
        </field>
</mapping>
...