Java: отображение иерархии DTO с использованием MapStruct - PullRequest
0 голосов
/ 14 января 2020

У меня есть классы питомцев, собак и кошек. Классы Dog и Cat расширяют Pet.

Также у меня есть PetDTO, DogDTO и CatDTO с аннотацией @JsonSubtype, поэтому Джексон хорошо разрешает класс dtos.

Я хочу написать картограф с помощью MapStruct, который принимает сущность PetDTO (может быть DogDTO или CatDTO) и возвращает Dog или Cat.

Для меня в этом случае главная цель использования библиотеки отображения - избежать ужасного кода с использованием instanceof.

Есть идеи? Спасибо!

1 Ответ

1 голос
/ 15 января 2020

В настоящее время невозможно из коробки - посмотрите этот билет в GitHub mapstruct: # 366 Поддержка отображения абстрактных классов или классов с базовым классом . Вы можете попробовать сделать это sh или добавить эту функцию самостоятельно. Выглядит как разумная особенность, которую нужно запрашивать.

Я полагаю, что при нынешнем положении вещей это ваш лучший вариант:

@Mapper
public interface PetMapper {

    default PetDTO toPetDto(Pet pet) {
        if (pet instanceof Dog) {
            return toDogDTO((Dog) pet);
        }

        if (pet instanceof Cat) {
            return toCatDTO((Cat) pet);
        }

        throw new IllegalArgumentException("Unknown subtype of Pet");
    }

    default Pet toPetEntity(PetDTO petDTO) {
        if (petDTO instanceof DogDTO) {
            return toDogEntity((DogDTO) petDTO);
        }

        if (petDTO instanceof CatDTO) {
            return toCatEntity((CatDTO) petDTO);
        }

        throw new IllegalArgumentException("Unknown subtype of PetDTO");
    }

    DogDTO toDogDTO(Dog dog);
    Dog toDogEntity(DogDTO dogDTO);

    CatDTO toCatDTO(Cat cat);
    Cat toCatEntity(CatDTO catDTO);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...