Позволяет ли 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);
...
}
Есть ли другой способ сделать это?