gpt4 book ai didi

使用 @aftermapping 进行 MapStruct 批量转换

转载 作者:行者123 更新时间:2023-12-02 03:55:08 25 4
gpt4 key购买 nike

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

我不希望在处理列表转换时调用 populateCatName ,从而重复我的装饰。

无论如何都要这样做吗?

最佳答案

在 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 的正确实例调用方法。

关于使用 @aftermapping 进行 MapStruct 批量转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44192527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com