2017-05-26 77 views
0

我想申请一个装饰使用专用@AfterMapping后单个项目转换的DTO和另一个专用的@AfterMapping处理其集合转换的味道,但不是两个。MapStruct批量转换与@aftermapping

public abstract CatUI convert(Cat cat); 
public abstract List<CatUI> convert(List<Cat> cats); 


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

@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()))); 
} 

我不想在处理List转换时调用populateCatName,因此会重复我的装饰。

无论如何要做到这一点?

回答

0

对于1.1.0.Final,您将不得不定义2个入口点(Mappers),其中一个带有转换列表,另一个没有它。

我建议你试试新的1.2.0.Beta2。有了这个,你可以使用新的@Context

可以有这样的接口:

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 
    } 
} 

和2个实现:

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()))); 
    } 
} 

最后你的映射器可以看起来像:

public interface CatMapper { 

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

然后,您将需要打电话给你方法与正确的背景实例SingleMappingContextListMappingContext