为了账号安全,请及时绑定邮箱和手机立即绑定

MapStruct:来自不同实体的字段映射到同一实体不同的字段

MapStruct:来自不同实体的字段映射到同一实体不同的字段

三国纷争 2021-10-28 09:24:29
我有 A 类、B 类和 C 类。A 类有三个变量,它根据 B 类和 C 类的不同字段进行填充。当我使用映射器填充对象时,只保留最后使用的映射器值。如何确保填充所有值。我正在使用 MapStruct 映射器(版本 1.2.0)和 Spring Boot 版本 2.0.3Sample code below:Class A{  String a;  String b;  String c;  }Class B{ String b1;}Class C{    String c1;}public interface AtoCmapper{  @Mappings({      @Mapping(target="c", source="source.c1")  })  A CtoA(C source);  @Mappings({      @Mapping(target="c1", source="source.c")  })  C AtoC(A source);}public interface AtoBmapper{  @Mappings({      @Mapping(target="b", source="source.b1")  })  A BtoA(B source);  @Mappings({      @Mapping(target="b1", source="source.b")  })  B AtoB(A source);}Class DAO{ @Autowired AtoBmapper aToBMapper; @Autowired AtoCmapper aToCMapper; public void testMapping(){  A aObject = new A();  aObject = aToBMapper(bObject); // Assume bObject is object to Type B and it is initialized properly  aObject = aToCMapper(cObject); // Assume cObject is object to Type B and it is initialized properly } //Now when I call testMapping() resulting A object only has value set for variable c, value of b is lost. How can I make sure that Values from B and C are set properly to Class A}
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

MapStruct 可以更新现有实例!为此,请通过具有@MappingTarget该类型的第二个注释参数的变体引入新的映射方法(或替换旧的方法)A(在这种情况下,可以用 替换返回类型void):


// In AtoBmapper

@Mappings(...)

void updateAFromB(B source, @MappingTarget A target);


// In AtoCmapper

@Mappings(...)

void updateAFromC(C source, @MappingTarget A target);

然后你可以写:


A aObject = new A();


aToBMapper.updateAFromB(bObject, aObject);

aToCMapper.updateAFromC(cObject, aObject);


// now aObject should contain the cumulated data from b and c


查看完整回答
反对 回复 2021-10-28
  • 1 回答
  • 0 关注
  • 615 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信