-
-
Notifications
You must be signed in to change notification settings - Fork 1k
Closed
Labels
Milestone
Description
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