Domanda

Considera 6 classi Pojo: 3 daos e 3 dtos.

Daos: "A", "B", "C"
Dtos: "one", "due", "tre"

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 un elenco di "b" s. "B" contiene un elenco di "C" s.
"One" contiene un elenco di "due" s. "Due" contiene un elenco di "tre" s.

"A" mappe a "uno" via "a2one". "B" mappe a "due" via "b2two". "C" mappe a tre 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 e C2THREE hanno un codice molto simile ad A2One.

Quindi questa è la mia domanda:

Attualmente la conversione tra l'elenco contenuto in "A" e "One" viene eseguita tramite un convertitore personalizzato (e funziona), ma sto ripetendo la stessa operazione che B2TWO dovrebbe eseguire (mappa da BS a due).

Esiste un modo per cascata le mappe di proprietà (A2One -> B2TWO -> C2THREE) quando l'elenco deve essere mappato senza dover scrivere un convertitore che semplicemente riproduce ciò che le mappe della proprietà stanno facendo?

Alternativa 1: Creazione di unapesmap personalizzata con generici List, List che inoltra alla mappa della proprietà/tipo corretta.

Alternativa 2: In A2One usa quanto segue per l'elenco

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

Where ListProvider estende AbstractProvider che restituisce un nuovo ArrayList ()

Alternativa 3: ???

Qualche idea? La documentazione per problemi di mappatura più coinvolti è molto scarsa sul sito Web e non sto necessariamente cercando quadri alternativi. Se vengono offerte alternative, devono consentire un facile refactoring (quindi Dozer e Orika sono fondamentalmente fuori).

Grazie in anticipo

Aggiornare: Al momento della scrittura di ModelMapper è fondamentalmente morto E in realtà non supporta elenchi o cascati di mappature in modo da essere costretto a scrivere una mappa e un convertitore per ogni oggetto che può essere anche un elenco.
Inoltre, ho scoperto che Orika ha mappature adatte ai refactoring estendendo Mapperbase. Inoltre, Orika può affrontare le mappature di singoli fagioli e elenchi di fagioli in trasparenza (usando una singola regola di mappatura per entrambe le situazioni).

Aggiornamento 2: In Orika è possibile eseguire una mappatura nidificata profonda bidirezionale delle raccolte utilizzando CustomMapper. Ciò consente la creazione di implementazioni di mappatura bidirezionale e consente loro di essere cascati ad altri mapper personalizzati. A2One avrebbe avuto un'istanza di B2TWO e lo userebbe in modo trasparente durante la mappatura delle "B" contenute in "A".

È stato utile?

Soluzione 2

Usando Orika sono stato in grado di ottenere tutti i requisiti di cui avevo bisogno in modo facile e amichevole.

Altri suggerimenti

Pensavo di indicare solo che questo è ora possibile con Model Mapper ...

Fa elenchi di supporto (almeno nella versione 0.7.5).

La mappa della proprietà per farlo sembrerebbe così:

public class A2One extends PropertyMap<A, One> {

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

        map(source.getB()).setOne(null);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top