Pregunta

Considere 6 clases de POJO: 3 DAO y 3 DTO.

Daos: "A", "B", "C"
DTOS: "One", "Two", "Three"

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" contiene una lista de "B" s. "B" contiene una lista de "C" s.
"Uno" contiene una lista de "dos" s. "Two" contiene una lista de "tres" s.

"A" mapas a "uno" a través de "a2one". "B" se mapea a "dos" a través de "B2TWO". "C" se mapea a tres a través de "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 y C2THE tienen un código muy similar a A2One.

Ésta es mi pregunta:

Actualmente, la conversión entre la lista contenida en "A" y "One" se realiza a través de un convertidor personalizado (y funciona), pero estoy repitiendo la misma operación que se supone que debe realizar (mapa BS a TWOS).

¿Hay alguna forma de en cascada los mapas de propiedades (A2One -> B2TWO -> C2Three) cuando la lista debe mapear sin tener que escribir un convertidor que simplemente reproduce lo que están haciendo los mapas de propiedades?

Alternativa 1: Creación de un tipEspuMap personalizado con genéricos List, List que reenvía al mapa correcto de propiedad/tipo.

Alternativa 2: En A2One, use lo siguiente para la lista

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

Donde ListProvider extiende AbstractProvider devolviendo nueva ArrayList ()

Alternativa 3: ???

¿Algunas ideas? La documentación para problemas de mapeo más involucrados es muy pobre en el sitio web y no necesariamente estoy buscando marcos alternativos. Si se ofrecen alternativas, deben permitir una fácil refactorización (por lo que Dozer y Orika están básicamente fuera).

Gracias por adelantado

Actualizar: A partir del momento de la escritura, ModelMapper es Básicamente muerto y en realidad no admite listas o en cascada de mapeos para que se vea obligado a escribir un mapa y un convertidor para cada objeto que también pueda ser una lista.
Además, encontré que Orika tiene mapeos amigables con la refactorización al extender MapperBase. Además, Orika puede tratar con mapeos de frijoles individuales y listas de frijoles de manera transparente (usando una sola regla de mapeo para ambas situaciones).

Actualización 2: En Orika es posible hacer un mapeo bidireccional anidado profundo de colecciones utilizando custommapper. Esto permite la creación de implementaciones de mapeo bidireccional y les permite ser en cascada a otros mapeadores personalizados. A2One mantendría una instancia de B2TWO y la usaría de manera transparente al mapear las "B" s contenidas en "A".

¿Fue útil?

Solución 2

Usando Orika pude obtener todos los requisitos que necesitaba de una manera fácil y amigable.

Otros consejos

Pensé que solo indicaría que esto ahora es posible con Model Mapper ...

Se admite listas (al menos en la versión 0.7.5).

El PropertyMap para hacerlo se vería así:

public class A2One extends PropertyMap<A, One> {

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

        map(source.getB()).setOne(null);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top