Skip to content

Deep mapping with multiple mappings broken in 1.6.0 #3667

@henrikhgbg

Description

@henrikhgbg

Expected behavior

Generate different 'inner' methods when mapping expressions require this, as done by verion 1.5.5.Final.

Actual behavior

With two @Mapping methods requiring different deep sources, the same method is used to map the lower type which is incorrect.

Steps to reproduce the problem

The following classes and mapping demonstrate the issue:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

public class MapTest {
  public static class SubSub1 {
    public String field;
  }
  public static class Sub {
    public SubSub1 subSub1;
    public SubSub1 subSub2;
  }
  public static class Main {
    public Sub sub;
  }
  public static class MappedSub {
    public String field;
  }
  public static class MainMapped {
    public MappedSub mappedSub;
  }
  @Mapper
  interface MainMapper {
    @Mapping(target = "mappedSub.field", source= "sub.subSub1.field")
    MainMapped mapMain1(Main main);

    @Mapping(target = "mappedSub.field", source= "sub.subSub2.field")
    MainMapped mapMain2(Main main);
  }

  public static void main(String[] args) {
    Main main = new Main();
    main.sub = new Sub();
    main.sub.subSub1 = new SubSub1();
    main.sub.subSub1.field = "field1";
    main.sub.subSub2 = new SubSub1();
    main.sub.subSub2.field = "field2";
    MainMapped mapped1 = Mappers.getMapper(MainMapper.class).mapMain1(main);
    MainMapped mapped2 = Mappers.getMapper(MainMapper.class).mapMain2(main);
    System.out.println(mapped1.mappedSub.field);
    System.out.println(mapped2.mappedSub.field);
  }
}

With 1.5.5.Final mapMain1 will use subToMappedSub and mapMain2 will use subToMappedSub1. Output is field1, field2.
With 1.6.0 both mapMain1 and 2 use subToMappedSub() which is not expected. Output is field1, field1.

MapStruct Version

1.6.0

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions