Mapstruct:在@Mapping

问题描述 投票:0回答:5

在 @Mapper 中使用多个参数时,@Context 参数似乎无法访问

public interface MyMapper {  
      @Mapping(target="target1", source="arg1.arg") //works
      @Mapping(target="target2", source="arg2") //works
      @Mapping(target="target3", source="arg2.arg") //works
      @Mapping(target="target2", source="context.arg") //NOT WORKING
      public MyTarget convert(Object arg1, Object arg2, @Context Object context);
      
}

我正在尝试使用 和

expression=""
来解决它,但我无法让它工作。

有什么建议吗?

我可以看到我并不是唯一一个希望如此的人。 https://github.com/mapstruct/mapstruct/issues/1280

谢谢

mapstruct
5个回答
21
投票

我遇到了同样的场景,因为我需要一个

@Context
参数才能传递给嵌套映射函数,但也想将其用作
@Mapping
中的源。我能够使用
expression
实现这一目标,如下所示:

public interface MyMapper {

  @Mapping(target="target1", source="arg1")
  @Mapping(target="target2", source="arg2")
  @Mapping(target="target3", expression="java( contextArg )")
  public MyTarget convert(Object arg1, Object arg2, @Context Object contextArg);

}

7
投票

回答你的第二个问题:


public interface MyMapper {

  @Mapping(target="target1", source="arg1.arg")
  @Mapping(target="target2", ignore = true ) // leave to after mapping 
  MyTarget convert(Object arg1, @Context Object context);

  @AfterMapping
  default convert(Object arg1, @MappingTarget MyTarget target, @Context context) {
        target.setTarget2( convert ( context ) );
  } 

  // if you have multipe mappings, you could address them here
  @Mapping(target="target2", source="context.arg") 
  MyInnerTarget convert(Object arg1, Object context);
}


5
投票

根据定义,

@Context
带注释的对象不是源。它是上下文,因此您不能将其用作
source
 中的 
@Mapping(target="target2", source="context.arg")

这里有一个相关的github问题和官方答案:github问题


1
投票

不太干净,但似乎与源和上下文具有相同的对象,允许以两种方式使用它。

  @Mapping(target="target1", source="arg1.arg")
  @Mapping(target="target2", source="arg2")
  @Mapping(target="target3", source="arg2.arg")
  @Mapping(target="target4", source="contextAsSource.arg") 
  public MyTarget convert(Object arg1, Object arg2, Object contextAsSource, @Context Object context);

这里contextAsSource和context是一样的。


0
投票

另一种方法,是定义额外的映射方法:

public interface MyMapper {  
      @Mapping(target="target1", source="arg1.arg") 
      @Mapping(target="target3", source="arg2.arg")
      @Mapping(target="target2", source="arg3.arg") 
      MyTarget convert(Object arg1, Object arg2, Object arg3, @Context Object context);

      default MyTarget convert(Object arg1, Object arg2, Object context) {
         return convert(arg1, arg2, context, context);
      }
      
}
© www.soinside.com 2019 - 2024. All rights reserved.