Support qualifier for SubclassMapping annotated methods
Use case
I want to specify which method the subclass mapping should use. For example sometimes i want to use a more complete method that maps all the fields of a subclass and sometimes i want to use a method that just map some fields. This is currently not possible because the qualifiers specified in the BeanMapping annotations is ignored.
These are my mappers:
@Mapper(uses = Dummy1Mapper.class) public interface DummyMapper { @SubclassMapping(source = Dummy1.class, target = Dummy1Dto.class) BaseDummyDto toDto(BaseDummy baseDummy); @BeanMapping(qualifiedByName = "light") @SubclassMapping(source = Dummy1.class, target = Dummy1Dto.class) BaseDummyDto toDtoLight(BaseDummy baseDummy); } @Mapper public interface Dummy1Mapper { Dummy1Dto toDto(Dummy1 dummy1); @Named("light") @Mapping(target = "descriptions", ignore = true) Dummy1Dto toDtoLight(Dummy1 dummy1); }
Generated Code
These are the generated mappers, as you can see Dummy1Mapper#toDtoLight is never called:
public class DummyMapperImpl implements DummyMapper { private final Dummy1Mapper dummy1Mapper = Mappers.getMapper( Dummy1Mapper.class ); @Override public BaseDummyDto toDto(BaseDummy baseDummy) { if ( baseDummy == null ) { return null; } if (baseDummy instanceof Dummy1) { return dummy1Mapper.toDto( (Dummy1) baseDummy ); } else { BaseDummyDto baseDummyDto = new BaseDummyDto(); baseDummyDto.setId( baseDummy.getId() ); return baseDummyDto; } } @Override public BaseDummyDto toDtoLight(BaseDummy baseDummy) { if ( baseDummy == null ) { return null; } if (baseDummy instanceof Dummy1) { return dummy1Mapper.toDto( (Dummy1) baseDummy ); } else { BaseDummyDto baseDummyDto = new BaseDummyDto(); baseDummyDto.setId( baseDummy.getId() ); return baseDummyDto; } } } public class Dummy1MapperImpl implements Dummy1Mapper { @Override public Dummy1Dto toDto(Dummy1 dummy1) { if ( dummy1 == null ) { return null; } Dummy1Dto dummy1Dto = new Dummy1Dto(); dummy1Dto.setId( dummy1.getId() ); List<String> list = dummy1.getDescriptions(); if ( list != null ) { dummy1Dto.setDescriptions( new ArrayList<String>( list ) ); } return dummy1Dto; } @Override public Dummy1Dto toDtoLight(Dummy1 dummy1) { if ( dummy1 == null ) { return null; } Dummy1Dto dummy1Dto = new Dummy1Dto(); dummy1Dto.setId( dummy1.getId() ); return dummy1Dto; } }
Possible workarounds
The only workaround is to write BaseMapper#toDtoLight by hand.
MapStruct Version
MapStruct 1.5.3