【发布时间】:2019-07-22 23:16:08
【问题描述】:
我创建了一个抽象映射器类,它具有以下方法:
public abstract Dest mapSourceToDest(Source source);
public abstract Dest mapSourceToDestWithParams(Source source, @Context Param1 param1; @Context Param2 param2);
Source 中有两个成员在转换为Dest 时非常昂贵(就性能而言)。
上面提到的第一种方法应该在source的所有成员都应该转换时使用(包括两次昂贵的转换)。
第二种方法应该在转换结果时使用在从source 到dest 的转换完成之前,这两个“昂贵”的成员就已经知道了。在这种情况下,这两个成员的转换结果作为参数param1 和param2 传递。这些参数应该用于避免昂贵的转换。
两个成员的转换是在一个用@AfterMapping注解的方法中完成的。我在AfterMapping方法中基本上想做的事情如下:
- 如果没有提供这两个参数,则进行昂贵的转换
- 如果提供了这两个参数,请使用它们并且不要进行转换
基本上应该是这样的:
@AfterMapping
protected void setExpensiveParams(Source source, @MappingTarget Dest dest,
@Context Param1 param1, @Context Param2 param2) {
if (param1 == null || param2 == null) {
performExpensiveConversionForParam1AndParam2();
} else {
dest.setParam1(param1);
dest.setParam2(param2);
}
}
这在这两种情况下都不起作用,因为这个 AfterMapping 方法只有在提供了带有 @Context 注释的两个参数时才会被调用。正如 MapStruct 文档明确指出的那样,这些上下文参数可能不为空,这与预期的一样。
我想不出一种方法来执行这两种替代类型的 AfterMappings,这取决于一个映射器类中可选参数的存在。我现在的解决方法是使用两个映射器类。不过,我真的很想用一个映射器类来处理这个问题。
【问题讨论】:
-
有几种方法可以做到这一点。