2010-06-18 4 views
2

Je me demande comment convertir une liste d'un type en un tableau d'un autre type en Java en utilisant Dozer. Les deux types ont tous les mêmes noms/types de propriété. Par exemple, considérons ces deux classes.Convertir la liste d'un type à Array d'un autre type en utilisant Dozer

public class A{ 
    private String test = null; 

    public String getTest(){ 
     return this.test 
    } 

    public void setTest(String test){ 
     this.test = test; 
    } 
} 

public class B{ 
    private String test = null; 

    public String getTest(){ 
     return this.test 
    } 

    public void setTest(String test){ 
     this.test = test; 
    } 
} 

J'ai essayé cela sans succès.

List<A> listOfA = getListofAObjects(); 
Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance(); 
B[] bs = mapper.map(listOfA, B[].class); 

J'ai également essayé d'utiliser la classe CollectionUtils.

CollectionUtils.convertListToArray(listOfA, B.class) 

Ni travailler pour moi, quelqu'un peut-il me dire ce que je fais mal? La fonction mapper.map fonctionne correctement si je crée deux classes wrapper, l'une contenant une List et l'autre a []. Voir ci-dessous:

public class C{ 
    private List<A> items = null; 

    public List<A> getItems(){ 
     return this.items; 
    } 

    public void setItems(List<A> items){ 
     this.items = items; 
    } 
} 

public class D{ 
    private B[] items = null; 

    public B[] getItems(){ 
     return this.items; 
    } 

    public void setItems(B[] items){ 
     this.items = items; 
    } 
} 

Cela fonctionne assez curieusement ...

List<A> listOfA = getListofAObjects(); 
C c = new C(); 
c.setItems(listOfA); 
Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance(); 
D d = mapper.map(c, D.class); 
B[] bs = d.getItems(); 

Comment puis-je faire ce que je veux faire sans utiliser les classes d'emballage (C & D)? Il doit y avoir un moyen plus facile ... Merci!

+1

Dans votre liste dernière il y a une faute de frappe, la commande de mappage doit être: D d = mapper.map (c , D.class); Juste essayé de comprendre votre problème et des exemples. –

+0

Merci, corrigé. – aheuermann

Répondre

3

Vous savez combien d'éléments sont listOfA avant de commencer l'itération. Pourquoi ne pas instancier le nouveau B [listOfA.size()] et ensuite itérer sur A, en plaçant vos nouvelles instances B directement dans le tableau. Vous allez vous épargner une itération supplémentaire sur tous les éléments de listOfB et le code sera en fait plus facile à lire pour démarrer.

Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance(); 

List<A> listOfA = getListofAObjects(); 
B[] arrayOfB = new B[listOfA.size()]; 

int i = 0; 
for (A a : listOfA) { 
    arrayOfB[i++] = mapper.map(a, B.class); 
} 
+0

Vous avez raison, merci pour la suggestion. – aheuermann

1

Ok, donc je suis un idiot. J'étais trop habitué à ce que Dozer fasse tout le travail pour moi ... Tout ce que j'avais à faire était de parcourir la liste des A et de créer une liste de B, puis de convertir cette liste en un tableau de B.

Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance(); 
List<A> listOfA = getListofAObjects(); 
Iterator<A> iter = listOfA.iterator(); 
List<B> listOfB = new ArrayList<B>(); 
while(iter.hasNext()){ 
    listOfB.add(mapper.map(iter.next(), B.class)); 
} 
B[] bs = listOfB.toArray(new B[listOfB.size()]); 

Problème résolu!

0

Il aura plus de sens si je pouvais écrire le code ci-dessous et il fonctionne

List<A> listOfA = getListofAObjects(); 
Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance(); 
B[] bs = mapper.map(listOfA, B[].class); 
+1

Namrata, j'ai ajouté quelques espaces à votre message pour le formater correctement. Vous devriez lire l'aide à la mise en forme. Cliquez simplement sur le lien "aide" à côté de la boîte de texte la prochaine fois que vous postez. –

Questions connexes