Mapstruct:在@Mapping 的源参数中使用上下文

Mapstruct : Use of context in source argument of @Mapping

在@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

谢谢

根据定义,@Context 注释对象不是源。它是上下文 所以你不能在 @Mapping(target="target2", source="context.arg")

中将它用作 source

这是一个相关的 github 问题,官方回答:github issue

回答你的第二个问题:


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);
}

我 运行 进入相同的场景,因为我需要一个 @Context 参数才能传递给嵌套映射函数,但也想将它用作 [=12] 中的源=].我能够使用 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);

}