Skip to content

Support for abstract class mapping or classes with base class #366

Description

@playbee

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;
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions