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

时间:2018-10-04 22:32:30

标签: java spring spring-boot mapstruct

我具有A,B和C类。A类具有三个变量,并且根据B和C类的不同字段进行填充。当我使用mapper填充对象时,仅保留最后使用的mapper值。如何确保所有值都已填充。     我在Spring Boot版本2.0.3中使用MapStruct映射器(版本1.2.0)

Sample 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 个答案:

答案 0 :(得分:3)

MapStruct可以update existing instances! 为此,请使用具有第二个@MappingTarget类型的A注释参数的变体引入新的映射方法(或替换旧的映射方法)(在这种情况下,可以用{{ 1}}):

void

然后您可以编写:

// In AtoBmapper
@Mappings(...)
void updateAFromB(B source, @MappingTarget A target);

// In AtoCmapper
@Mappings(...)
void updateAFromC(C source, @MappingTarget A target);