Java MapStruct:如何使用可选参数进行@AfterMapping?

Java MapStruct:如何使用可选参数进行@AfterMapping?,java,mapstruct,Java,Mapstruct,我创建了一个抽象映射器类,它具有以下方法: public abstract Dest mapSourceToDest(Source source); public abstract Dest mapSourceToDestWithParams(Source source, @Context Param1 param1; @Context Param2 param2); Source中有两个成员,在执行到Dest的转换时,转换这两个成员的成本非常高(就性能而言) 当需要对源的所有成员进行转换(包

我创建了一个抽象映射器类,它具有以下方法:

public abstract Dest mapSourceToDest(Source source);
public abstract Dest mapSourceToDestWithParams(Source source, @Context Param1 param1; @Context Param2 param2);
Source
中有两个成员,在执行到
Dest
的转换时,转换这两个成员的成本非常高(就性能而言)
当需要对
的所有成员进行转换(包括两个昂贵的转换)时,应使用上述第一种方法。
当两个“昂贵”的转换结果时,应使用第二种方法从
source
dest
ist的转换完成之前,已经知道了成员。在这种情况下,这两个成员的转换结果作为参数
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); 
    } 
}
但这在两种情况下都不起作用,因为只有在提供了用@Context注释的两个参数时,才会调用此AfterMapping方法。这是意料之中的,因为MapStruct文档清楚地指出,像这样的上下文参数可能不为null

我无法找到一种方法来执行这两种可选的aftermapping,这取决于一个mapper类中可选参数的存在。我现在的解决方法是使用两个映射器类。不过我真的很想用一个mapper类来处理这个问题。

我看到了两个选项

备选案文1: *您可以使用属性Param1和Param2创建自己的上下文类,这些属性可以使用Param1和Param2(优化)构造,也可以不使用。此上下文仅传递给一个方法。MapStruct的一个鲜为人知的特性是,您可以将生命周期方法(@AfterMapping)放入上下文中的方法中。根据是否设置了参数,可以从映射器中的上下文调用昂贵的映射,或者在上下文中实现它们

备选案文2: 使用@MappingTarget并使用已经设置好的两个目标参数预先创建目标对象。取消相应的源。使用nullvaluepropertymappingstrategy.ignore,以便MapStruct在相应的源属性为null时跳过这些。您甚至可以使用第二个方法的签名在默认方法中实现此功能。

我看到了两个选项

备选案文1: *您可以使用属性Param1和Param2创建自己的上下文类,这些属性可以使用Param1和Param2(优化)构造,也可以不使用。此上下文仅传递给一个方法。MapStruct的一个鲜为人知的特性是,您可以将生命周期方法(@AfterMapping)放入上下文中的方法中。根据是否设置了参数,可以从映射器中的上下文调用昂贵的映射,或者在上下文中实现它们

备选案文2:
使用@MappingTarget并使用已经设置好的两个目标参数预先创建目标对象。取消相应的源。使用nullvaluepropertymappingstrategy.ignore,以便MapStruct在相应的源属性为null时跳过这些。您甚至可以使用第二个方法的签名在默认方法中实现此功能。

有几种方法可以实现此功能。出于好奇,有几种方法可以实现此功能。。你选择了哪个选项?出于好奇。。你选择了哪个选项?