2017-05-26 6 views
0

Ich möchte eine Dekoration mit einem dedizierten @AfterMapping nach der Einzelelement-Konvertierung eines DTO und einem anderen dedizierten @AfterMapping anwenden, wenn es um seine Sammlung Konvertierung Geschmack aber nicht beides geht.MapStruct Bulk-Konvertierung mit @nach dem Mapping

Ich möchte nicht populateCatName aufgerufen werden, wenn es um List-Konvertierung geht und daher meine Dekoration duplizieren.

Wie auch immer, dies zu tun?

Antwort

0

Mit 1.1.0.Final müssen Sie 2 Eingangspunkte (Mapper) definieren, eine mit der Konvertierung in der Liste und die andere ohne sie.

Ich würde vorschlagen, dass Sie die neue 1.2.0.Beta2 ausprobieren. Mit diesem können Sie das neue @Context verwenden.

Sie eine Schnittstelle wie haben:

public interface CatMappingContext { 

    @AfterMapping 
    public default void populateCatName(Cat cat, @MappingTarget CatUI catUI) { 
     //nothing per default 
    } 

    @AfterMapping 
    public void populateCatNames(List<Cat> cats, @MappingTarget List<CatUI> catUIs) { 
     //nothing per default 
    } 
} 

und 2 Ausführungen:

public interface CatMapper { 

    public CatUI convert(Cat cat, @Context CatMappingContext context); 
    public List<CatUI> convert(List<Cat> cats, @Context CatMappingContext context); 
} 

Sie werden dann anrufen müssen:

public class SingleMappingContext implements CatMappingContext { 

    @AfterMapping 
    public void populateCatName(Cat cat, @MappingTarget CatUI catUI) { 
     String name = _someRemoteService.getCatName(catUI.getId()); 
     catUI.setName(name); 
    } 
} 

public class ListMappingContext implements CatMappingContext { 

    @AfterMapping 
    public void populateCatNames(List<Cat> cats, @MappingTarget List<CatUI> catUIs) { 
     Map<Integer,String> idToNameMap = _someRemoteService.getCatNames(catUIs.stream().map((c) -> c.getId()).collect(Collectors.toList()); 
     catUIs.forEach((c) -> c.setName(idToNameMap(c.getId()))); 
    } 
} 

Schließlich Ihr Mapper aussehen kann Methoden mit der richtigen Instanz des Kontexts SingleMappingContext oder der ListMappingContext.

Verwandte Themen