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.
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. –
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
Merci pour la réponse! Je l'ai mal utilisé dans l'interface. Ma faute ... L'approche est la bonne façon. –