Question

Considérez 6 classes POJO:. 3 et 3 OTI DTO

OTI: "A", "B", "C"
DTO: "One", "Deux", "Trois"

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" contient une liste des "B" s. s "B" contient une liste de "C".
s « One » contient une liste de « deux ». s « Two » contient une liste des « Trois ».

"A" correspond à "One" via "A2One". cartes "B" à "Deux" via "B2Two". "C" correspond à trois via "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 et C2Three ont un code très similaire à A2One.

Alors, voici ma question:

Actuellement, la conversion entre la liste contenue dans « A » et « One » se fait via un convertisseur personnalisé (et il fonctionne), mais je répète la même opération que B2Two est censé effectuer (carte à Twos B) .

Est-il possible de tomber en cascade les Cartes des propriétés (A2One -> B2Two -> C2Three)? Lorsque la liste doit être mappée sans avoir à écrire un convertisseur qui ne fait que reproduire ce que les Cartes des propriétés font

Alternative 1 :. Création d'une TypeMap personnalisée avec Generics List, List qui avant la bonne propriété / Type de carte

Alternative 2 : En A2One utiliser les éléments suivants pour la liste

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

Où ListProvider étend AbstractProvider retour new ArrayList ()

Alternative 3 : ???

Toutes les idées? La documentation pour les questions de cartographie plus impliqués est très pauvre sur le site et je ne cherche pas nécessairement des cadres alternatifs. Si des solutions de rechange sont offerts, ils doivent permettre refactoring facilement (si Dozer et Orika sont essentiellement hors).

Merci à l'avance

Mise à jour : Au moment de l'écriture ModelMapper est fondamentalement morts et ne fait pas support des listes ou en cascade des applications afin que vous seriez obligé d'écrire une carte et un convertisseur pour chaque objet qui peut être une liste aussi.
De plus, je trouve Orika a mappings refactorisation-friendly en étendant MapperBase. De plus Orika peut traiter les correspondances de haricots individuels et des listes de haricots transparente (en utilisant une règle de mappage unique pour les deux situations).

Mise à jour 2 : En Orika il est possible de faire la cartographie imbriquée profonde bidirectionnelle des collections en utilisant CustomMapper. Cela permet la création d'implémentations de mise en correspondance bidirectionnelle et leur permet d'être montés en cascade à d'autres cartographes personnalisés. A2One tiendrait une instance de B2Two et de l'utiliser de manière transparente lors du mappage de la « B » S contenu dans « A ».

Était-ce utile?

La solution 2

En utilisant Orika j'ai été en mesure d'obtenir toutes les exigences que je avais besoin d'une manière simple et conviviale.

Autres conseils

Je pensais juste indiquer que cela est désormais possible avec le modèle cartographe ...

Il fait des listes de soutien (au moins sur la version 0.7.5).

Le PropertyMap de le faire ressembler à ceci:

public class A2One extends PropertyMap<A, One> {

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

        map(source.getB()).setOne(null);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top