2017-08-28 2 views
1

J'utilise Mapstruct pour gérer le code standard d'application d'un POJO à un autre.Mappage d'une collection à la carte et vice versa avec Mapstruct

Voici le DTO:

import java.util.Collection; 

public class TestTO { 
    String name; 
    Collection<AttributeTO> attributes; 
} 

Voici le tracé POJO:

import java.util.Map; 

public class Test { 
    String name; 
    Map<String, Attribute> attributes; 
} 

Je cherche une façon élégante de gérer la correspondance entre le Map et le Collection. Actuellement, j'utilise l'attribut expression de l'annotation @Mapping. Depuis Attribute références Test J'utilise un CycleBreakingContext à partir de l'exemple "mapping with cycles".

@Mapping(target = "attributes", expression = "java(test.getAttributes().values().stream().map(a -> this.map(a, context)).collect(java.util.stream.Collectors.toList()))") 
abstract TestTO map(Test test, @Context CycleBreakingContext context); 

L'interface contient également une application de la méthode Attribute-AttributeTO avec le nom map.

Existe-t-il un moyen plus élégant d'implémenter cette conversion d'un Map non itérable en un Collection? Mon approche fonctionne mais a ses inconvénients. Le refactoring, par exemple, ne reconnaît pas les fragments de code dans les chaînes.

Répondre

2

Qu'en est-il des méthodes de mappeur par défaut?

Dans votre interface mappeur, vous pouvez fournir l'implémentation par défaut des instructions MapStruct sur la façon de mapper des types donnés, par exemple:

default Collection<Integer> mapAttributes(Map<String, Integer> attributes) { 
    return attributes.values(); 
} 

Cette méthode sera appelée à chaque fois MapStruct tente de carte de carte Collection.

Vous êtes libre de le personnaliser autant que vous le souhaitez.

+0

Si j'ajoute ceci à mon interface j'obtiens l'erreur suivante pendant la compilation: Impossible de générer la méthode de mappage du type non itérable au type itérable. –

+0

C'est étrange, êtes-vous sûr de l'ajouter avec le mot clé 'default'? Une alternative à l'utilisation de 'default' est d'avoir une classe util et des méthodes statiques dessus (si votre mapping est sans état). – Filip

+0

Merci pour la réponse! Je l'ai mal utilisé dans l'interface. Ma faute ... L'approche est la bonne façon. –