如何使用MapStruct链式调用已有映射器实现A→C转换?
复用已有MapStruct映射器实现A→C链式映射
你可以直接依赖MapStruct的自动映射路径推断能力,不需要手动编写toC(A a)的实现,具体处理方式如下:
保留抽象方法,移除手动实现
直接保留public abstract C toC(A a);这个抽象方法即可,MapStruct会自动识别现有的A→B和B→C映射方法,生成和你预期一致的链式调用实现逻辑。@AfterMapping会自动触发对应逻辑
你定义的两个additionalStuff方法会被MapStruct自动匹配执行:
- 调用
toB(A a)转换时,会触发additionalStuff(A a, @MappingTarget B b) - 完成
C实例的链式生成后,会触发additionalStuff(A a, @MappingTarget C c)
最终简化后的Mapper类代码如下:
@Mapper public abstract class TestMapper { public abstract B toB(A a); public abstract C toC(B b); // MapStruct自动生成链式调用的实现 public abstract C toC(A a); @AfterMapping protected void additionalStuff(A a, @MappingTarget B b) { // some mapping logic } @AfterMapping protected void additionalStuff(A a, @MappingTarget C c) { // some mapping logic } }
如果遇到存在多个可选转换路径的复杂场景,也可以通过@Mapping注解显式指定转换逻辑,示例如下:
@Mapping(target = ".", expression = "java(toC(toB(a)))") public abstract C toC(A a);
不过这种显式声明在大多数简单链式映射场景下是多余的,MapStruct的自动推断已经能满足需求。
内容的提问来源于stack exchange,提问作者Mobius
相关产品推荐
相关产品推荐

