For example (one abstract class and two concrete classes):
public abstract class Animal {
private String name;
...
}
public class Cat extends Animal {
private Boolean mouseCatcher;
...
}
public class Dog extends Animal {
private Integer awardsCount;
...
}
DTO:
public abstract class AnimalDto {
private String name;
...
}
public class CatDto extends AnimalDto {
private Boolean mouseCatcher;
...
}
public class DogDto extends AnimalDto {
private Integer awardsCount;
...
}
And mapper:
@Mapper
public interface AnimalMapper {
public CatDto catToCatDto(Cat cat);
public DogDto dogToDogDto(Dog dog);
@AbstractMapping // special mark to generate abstract mapping method
public AnimalDto animalToAnimalDto(Animal animal);
public List<AnimalDto> animalsToAnimalDtos(List<Animal> animals);
}
Generated result:
public class AnimalMapperImpl implements AnimalMapper {
public CatDto catToCatDto(Cat cat) {
...
}
public DogDto dogToDogDto(Dog dog) {
...
}
// example of generated method for abstract mapping
public AnimalDto animalToAnimalDto(Animal animal) {
if (animal instanceof Cat)
return catToCatDto((Cat) animal);
else if (animal instanceof Dog)
return dogToDogDto((Dog) animal);
return null;
}
public List<AnimalDto> animalsToAnimalDtos(List<Animal> animals) {
if ( animals == null ) {
return null;
}
List<AnimalDto> list = new ArrayList<AnimalDto>();
for ( Animal animal : animals ) {
list.add( animalToAnimalDto( animal ) );
}
return list;
}
}
For example (one abstract class and two concrete classes):
DTO:
And mapper:
Generated result: