首页 文章

使用@aftermapping进行MapStruct批量转换

提问于
浏览
0

我想在DTO的单项转换之后使用专用的@AfterMapping来应用装饰,而在处理其集合转换风格时使用另一个专用的@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,因此重复我的装饰 .

无论如何要做到这一点?

1 回答

  • 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 的正确实例调用您的方法 .

相关问题