Вопрос

Рассмотрим 6 классов POJO: 3 DAO и 3 DTOS.

DAOS: "A", "B", "c"
DTOS: "One", "два", "Три"

public class A {

    private int idOfA;
    private String name;
    private List<B> b;

    // getters, setters, etc...
}

public class B {

    private int idOfB;
    private String name;
    private List<C> c;

    // getters, setters, etc...
}

public class C {

    private int idOfC;
    private String name;

    // getters, setters, etc...
}



public class One {

    private int id;
    private String name;
    private List<Two> two;

    // getters, setters, etc...
}

public class Two {

    private int id;
    private String name;
    private List<Three> Three;

    // getters, setters, etc...
}

public class Three {

    private int id;
    private String name;

    // getters, setters, etc...
}

"A" содержит список "B" s. "B" содержит список "C" s.
«Один» содержит список «два» с. «Два» содержит список «Три» с.

"Карты" один "через" A2one ". «B» карты на «два» через «b2two». "C" Карты на три через "C2three".

public class A2One extends PropertyMap<A, One> {

    @Override
    protected void configure() {
        map().setId(source.getIdOfA());
        map().setName(source.getName());

        when(Conditions.isNotNull()).using(new BListConverter()).map(source.getBs()).setTwos(null);
    }
}

public class BListConverter extends AbstractConverter<List<B>, List<Two>> {

        @Override
        protected List<Two> convert(List<B> source) {

            List<Two> twos = new ArrayList<Two>(source.size());

            for(B b : source) {
                Two t = new Two();
                t.setId(b.getId());
                t.setName(b.getName());

                // Ignore list of Cs contained in B for now

                twos.add(t);
            }

            return twos;
        }
}

public class B2Two extends PropertyMap<B, Two> {

    @Override
    protected void configure() {
        map().setId(source.getIdOfB());
        map().setName(source.getName());

        when(Conditions.isNotNull()).using(new CListConverter()).map(source.getCs()).setThrees(null);
    }
}

B2TWO и C2THREE имеют очень похожий код на A2ONE.

Вот мой вопрос:

В настоящее время преобразование между списком, содержащимися в «A» и «One», выполняется через пользовательский преобразователь (и это работает), но я повторяю ту же операцию, что и B2TWO, который должен выполнять (Map BS до TWO).

Есть ли какой -либо способ каскады карты собственности (A2one -> b2two -> c2three), когда список должен быть сопоставлен без необходимости писать конвертер, который просто воспроизводит то, что делают карты свойства?

Альтернатива 1: Создание пользовательской типовой карты с дженериками List, List что перекидывает правильную карту свойства/типа.

Альтернатива 2: В A2one используйте следующее для списка

mapper.addMappings(new BList2TwoList());
when(Conditions.isNotNull()).withProvider(listProvider).map().setTwos(mapper.map(source.getBs(), List.class));

Где ListProvider расширяет AbstractProvider, возвращая New ArrayList ()

Альтернатива 3: ???

Любые идеи? Документация по более сложным вопросам отображения очень плохая на веб -сайте, и я не обязательно ищу альтернативные рамки. Если предлагаются альтернативы, они должны разрешить легкий рефакторинг (так что в основном тузера и Орика).

заранее спасибо

Обновлять: На момент написания модели Modelmapper в основном мертвы и на самом деле не поддерживает списки или каскаду отображений, чтобы вы были вынуждены написать карту и преобразователь для каждого объекта, который также может быть списком.
Кроме того, я обнаружил, что Орика имеет рефакторинговые отображения, расширяя MapperBase. Более того, Орика может прозрачно справляться с отображением отдельных бобов и списков бобов (используя одно правило отображения для обеих ситуаций).

Обновление 2: В Орике можно сделать двунаправленное глубокое вложенное картирование коллекций, используя CustomMapper. Это обеспечивает создание двухнаправленных реализаций картирования и позволяет им каскадным с другими пользовательскими картерами. A2one будет иметь экземпляр B2TWO и использовать его прозрачно при сопоставлении «B», содержащихся в «A».

Это было полезно?

Решение 2

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

Другие советы

Я думал, что просто укажу, что теперь это возможно с Model Mapper ...

Он содержит списки (по крайней мере, в версии 0.7.5).

Карта недвижимости, чтобы сделать это, будет выглядеть так:

public class A2One extends PropertyMap<A, One> {

    @Override
    protected void configure() {
        map().setId(source.getIdOfA());
        map().setName(source.getName());

        map(source.getB()).setOne(null);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top