2017-09-19 1 views
0

Dans la version MapStruct 1.1.0.Final, cela a été possible ....MapStruct: Comment passer l'objet d'entrée à l'expression?

@Mappings({ 
    @Mapping(target = "transaction.process.details", expression = "java(MappingHelper.mapDetails(request))"), 
    //more mappings 
}) 
Response requestToResponse(Request request); 

Il était possible, car la méthode était mapDetails (par hasard?) Généré dans la méthode requestToResponse. C'est pourquoi request n'était pas nul.

Maintenant, depuis 1.1.0.Final ne fonctionnait pas avec Lombok, je devais passer à 1.2.0.CR2. Avec cette version, le mapDetails sera généré dans une méthode séparée où request n'est pas passé, donc request est null dans cette méthode maintenant et j'obtiens un NPE avec l'expression. (C'est une sous-sous-méthode de requestToResponse maintenant.)

Ai-je mal utilisé l'expression, alors est-ce que ça a fonctionné par hasard, ou est-ce que la nouvelle version a un bug? Si aucun bug, comment dois-je passer l'instance request à l'expression correctement?

Répondre

2

Vous avez abusé de l'expression. Ce que vous devez faire est de mapper votre cible à votre paramètre source.

@Mapper(uses = { MappingHelper.class }) 
public interface MyMapper { 

    @Mappings({ 
     @Mapping(target = "transaction.process.details", source = "request"), 
     //more mappings 
    }) 
    Response requestToResponse(Request request); 
} 

MapStruct devrait alors créer des méthodes intermédiaires et utiliser le MappingHelper et invoquer la méthode mapDetails. Dans le cas où vous avez plusieurs méthodes qui mappent de Request au type details alors vous devrez utiliser des mappages qualifiés (voir plus here dans la documentation).

Il ressemblera à quelque chose comme:

public class MappingHelper { 
    @Named("mapDetails") // or the better type safe one with the meta annotation @Qualifier 
    public static String mapDetails(Request request); 
} 

Et votre carte ressemblera:

@Mapper(uses = { MappingHelper.class }) 
public interface MyMapper { 

    @Mappings({ 
     @Mapping(target = "transaction.process.details", source = "request", qualifiedByName = "mapDetails"), //or better with the meta annotation @Qualifier qualifiedBy 
     //more mappings 
    }) 
    Response requestToResponse(Request request); 
} 
+0

Merci, fonctionne à nouveau :) – Bevor

+0

Assurez-vous que vous avez de bons tests pour cela, les propriétés cibles imbriquées a été amélioré dans 1.2.0 et il pourrait y avoir des cas où il ne fonctionne pas correctement (il était buggé avant aussi bien) – Filip