Как использовать mapstruct на родительском объекте, чтобы определить правильный дочерний маппер? - PullRequest
0 голосов
/ 20 марта 2019

Позволяет ли mapstruct определять правильный дочерний маппер из родительского объекта?

У нас есть несколько классов, которые расширяют родительский класс, и нам нужен способ автоматического поиска нужного преобразователя.

Решение, которое я использую, включает в себя карту класса mapper и загружает правильную карту, когда вы проверяете класс или тип объекта. Другое решение состоит в том, чтобы иметь запутанный случай переключения или, если еще, с экземпляром каждого возможного дочернего класса.

Пример модели:

public class ParentClass{
String getType();
}

public class ChildClass1 extends ParentClass{

}

public class ChildClass2 extends ParentClass {
}

к этой модели:

public class ParentClassDto{
String getType();
}

public class ChildClass1Dto extends ParentClassDto{

}

public class ChildClass2Dto extends ParentClassDto {
}

Все отлично работает, когда один на один (ChildClass1 -> ChildClass1Dto с ChildClass1Mapper или ChildClass2 -> ChildClass2Dto с ChildClass2Mapper)

Наше текущее решение включает карту с картографом, подобным этому:

@Mapper
public interface ParentClassMapper{
    ParentClassDto convertToDto(ParentClass p);
    ParentClass convertDTOToModel(ParentClassDto dto);
}


@Mapper
public interface ChildClass1Mapper implements ParentClassMapper

Карта, чтобы найти правильный:

public class MapperFinder{

    static Map<String, ParentClassMapper> map;

    static {
        map = new HashMap<>();
        map.put("ParentClassType", ParentClassMapper.class);
        map.put("ChildClass1Type", ChildClass1Mapper.class);
        map.put("ChildClass2Type", ChildClass2Mapper.class);
    }

    public ParentClassDto mapModelToDTO(ParentClass p){
        Class mapperClass = map.get(p.getType);
        MyMapper mapper = Mappers.getMapper( mapperClass );
        return mapper.convertToDto(p);
    }


    public ParentClass mapDTOToModel(ParentClassDto dto){
        Class mapperClass = map.get(dto.getType);
        MyMapper mapper = Mappers.getMapper( mapperClass );
        return mapper.convertDTOToModel(dto);
    }
}

и использование будет в сервисе

@Autowired
MapperFinder mapperFinder;

public void save (ParentClass pc){
    (pc is a instance of child ChildClass1)
    ... 
    ParentClassDto dto = mapperFinder.mapModelToDTO(pc);
    repo.save(dto);
    ...
}

Есть ли другой способ сделать это?

1 Ответ

1 голос
/ 06 апреля 2019

Посмотрите на этот пример (все еще PR) на репозитории примеров. Он предлагает стандартный интерфейс сопоставления и функцию хранилища для (более или менее) достижения того, что вы хотите.

...