Преобразование вложенной коллекции с помощью Dozer - PullRequest
4 голосов
/ 17 февраля 2012

У меня есть класс A, у которого есть вложенный набор класса B:

public class A {
    private Set<B> children;
}

public class B {
    private int value;
}

У меня также есть класс C, у которого есть вложенный набор класса D:

public class C {
    private Set<D> children;
}

public class D {
    private int value;
}

Теперь, учитывая список A, как мне преобразовать его в список C?В идеале мне не нужно указывать какие-либо подсказки по отображению, поскольку я использую дженерики.Например:

List<A> src = new ArrayList<A>();
// ----- Add some A's to src -----
List<C> dst = mapper.map(src, List<C>.class);

Очевидно, синтаксис последней строки неверен.Что это должно быть?Также, как мне сообщить Dozer, какой тип списка или набора создать?

Спасибо.

Нареш

Ответы [ 2 ]

4 голосов
/ 07 мая 2013

На самом деле на них есть ответы в их FAQ, но почему-то в разделе «продвинутые» это все так и есть. Я не думаю, что это сложная тема, я думаю, что это обычное дело, чтобы хотеть сделать. Вы делаете это с подсказкой коллекции.

При отображении коллекций, как мне сообщить Dozer, какой тип объектов данных я хочу в целевой коллекции?

Подсказки поддерживаются справиться с этим вариантом использования. Подсказки не требуются, если вы используете JDK 1.5 Generics, потому что типы могут быть автоматически обнаружены Dozer. Но если ты не используют дженерики, чтобы преобразовать коллекцию / массив в Коллекция / Массив с объектами разных типов, для которых вы можете указать подсказку сообщите Dozer, какой тип объектов вы хотите создать в список адресатов. Если подсказка не указана для пункта назначения поле, то коллекция назначения будет заполнена объектами того же типа, что и элементы в коллекции src.

<field>
  <a>someList</a>
  <b>otherList</b> 
  <b-hint>org.dozer.vo.TheFirstSubClassPrime</b-hint> 
</field>

Этот ответ показывает вам, как это сделать в xml. Вот как вы можете сделать это в Java-коде с Mapping:

import org.dozer.loader.api.BeanMappingBuilder;

import static org.dozer.loader.api.FieldsMappingOptions.hintB;

public class Mapping extends BeanMappingBuilder {
    @Override
    protected void configure() {
        mapping(Subject.class, JsonSubject.class)
                .fields("names", "names", hintB(JsonName.class));
    }
}

Подсказка сообщает dozer: «этот список должен быть преобразован в список экземпляров JsonName». Вот как вы добавляете это сопоставление в свой маппер:

    mapper = new DozerBeanMapper();
    mapper.addMapping(new Mapping());
0 голосов
/ 11 января 2013

Вы должны просто расширить этот список преобразования. Dozer конвертирует JavaBeans и подобные объекты, а не коллекции. Итак, если вы хотите передать коллекции, вы можете создать оболочку, например

public class EntityConverter {
    private Mapper mapper;

    public EntityConverter(Mapper mapper) {
        this.mapper = mapper;
    }

    public <F, T> List<T> convert(List<F> fromList, final Class<T> toClass) {
        return Lists.transform(fromList, new Function<F, T>() {
            @Override
            public T apply(F from) {
                return convert(from, toClass);
            }
        });
    }

    public <F, T> T convert(F from, final Class<T> toClass) {
        if (from == null) return null;
        return mapper.map(from, toClass);
    }
}

Примечание: этот код использует гуаву.

...