2

我想在 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 并因此复制我的装饰。

无论如何要这样做?

4

1 回答 1

4

使用 1.1.0.Final 您将必须定义 2 个入口点(映射器),一个带有列表转换,另一个没有它。

我建议您试用新的 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.

于 2017-05-26T19:18:06.190 回答