2017-09-05 1 views
0

J'ai récemment choisi MapStruct, et j'aime beaucoup son fonctionnement. Depuis que je suis nouveau à MapStruct, je m'excuse d'avance si cette question est stupide ou n'a pas de sens.Est-il possible que MapStruct détecte automatiquement les mappages pour les collections contenant des types génériques en tant que source et cible?

En raison de la version du serveur, je suis lié à Java 6.

J'ai 3 types d'entités, A, B et C, ainsi que leurs homologues DTO.

public class A{ 
    //... 
} 
public class B extends A{ 
    //... 
} 
public class C extends A{ 
    //... 
} 

public class ADto{ 
    //... 
} 
public class BDto extends ADto{ 
    //... 
} 
public class CDto extends ADto{ 
    //... 
} 

Mon mappeur définit:

public abstract ADto mapAToADto(A source); 

public abstract A mapADtoToA(ADto source); 

public abstract BDto mapBToBDto(B source); 

public abstract B mapBDtoToB(BDto source); 

public abstract CDto mapCToCDto(C source); 

public abstract C mapCDtoToC(CDto source); 

Ce qui fonctionne très bien pour l'instant. Dans mon application, je travaille avec List<A> et List<ADto> qui contient les deux sous-types.

Ma mise en œuvre actuelle consistait à implémenter ma propre méthode de mappage qui itère sur la liste source et vérifie les types avec instanceof, puis appelle la méthode de mappage correspondante répertoriée ci-dessus.

mise en œuvre actuelle:

public <T extends ADto, S extends A> List<T> toList(List<S> source) { 
if (source == null) { 
    return null; 
} 

List<T> list = new ArrayList<T>(); 
for (S entity : source) { 
    if (entity instanceof B) { 
     list.add((T) mapBToBDto((B) entity)); 
    } else if (entity instanceof C) { 
     list.add((T) mapCToCDto((C) entity)); 
    } else { 
     list.add((T) mapADtoToA((A) entity)); 
    } 
} 

return list; 
}; 

Je me demandais s'il y a un moyen de diriger MapStruct pour comprendre automatiquement. Est-ce que je manque quelque chose?

Edit: Mon approche optimiste était avec:

@IterableMapping(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL) 
public abstract <T extends ADto, S extends A> List<T> listAToADto(List<S> source); 

qui se traduit par:

Impossible de générer la méthode de mise en correspondance pour une variable cible type générique

Merci

Répondre

1

Votre implémentation La tation est correcte. MapStruct est un processeur d'annotation qui génère du code lors de la compilation. Nous ne générons aucun contrôle de réflexion (Tous les types qui implémentent et interfacent ou étendent une classe ne sont pas connus lors de la compilation). Par conséquent, votre approche du problème est correcte.

+0

Tout ce que je voulais savoir, merci. –