在 @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
中的源。我能够使用 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);
}
回答你的第二个问题:
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
带注释的对象不是源。它是上下文,因此您不能将其用作 source
中的
@Mapping(target="target2", source="context.arg")
这里有一个相关的github问题和官方答案:github问题
不太干净,但似乎与源和上下文具有相同的对象,允许以两种方式使用它。
@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是一样的。
另一种方法,是定义额外的映射方法:
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);
}
}