2017-09-27 1 views
0

je besoin d'une cartographie pour y parvenir:MapStruct: Comment mapper tous les attributs au premier élément d'une liste?

@Mapping(source = "a", target = "result.transaction[0].a"), 
@Mapping(source = "b", target = "result.transaction[0].b"), 
@Mapping(source = "c", target = "result.transaction[0].c"), 
... 
Response dataToResponse(DataModel model); 

Mais cette syntaxe ne fonctionne pas (BTW: Cela fonctionne avec emballage Spring Bean). Une solution comme this est juste une solution demi-cuite:

@AsList 
public <T> List<T> asList(T in) { 
    List<T> result = new ArrayList<T>(); 
    if (in!=null) { 
     result.add(in); 
    } 
    return result; 
} 

Cela ne fonctionne que pour exactement un attribut car il crée toujours une nouvelle liste pour chaque attribut. Je n'ai pas besoin de mapper chaque attribut au premier élément d'une nouvelle liste. La liste doit être réutilisée mais je ne sais pas comment cela fonctionne. Quelle est la bonne façon d'y parvenir? Je pensais à quelque chose comme ceci:

@Mapping(source = "a", target = "transaction.a"), 
@Mapping(source = "b", target = "transaction.b"), 
@Mapping(source = "c", target = "transaction.c"), 
... 
Transaction dataToTransaction(DataModel model); 

puis ...

@Mapping([use Transaction from b4], target = "result"); 

Mais comment puis-je passer les champs déjà mis en correspondance d'en haut? (J'utilise la dernière version finale 1.1.0.Final)

Répondre

0

Évidemment, il n'y a pas de solution propre pour cela. Donc, je devais contourner l'exclure par le mappage suivant dans un mappeur séparé:

@Mapping(source = "a", target = "transaction.a"), 
@Mapping(source = "b", target = "transaction.b"), 
@Mapping(source = "c", target = "transaction.c"), 
Transaction dataToTransaction(DataModel model); 

Dans la principale cartographe, j'exécute le mappeur séparé et le convertir en une liste par l'expression:

@Mapping(expression = "java(Arrays.asList(SubMapper.INSTANCE.dataToTransaction(model)))", target = "result.transactions")