Возможно ли, чтобы MapStruct автоматически обнаруживал сопоставления для Коллекций, содержащих универсальные типы как в качестве источника, так и цели?
Я недавно взял MapStruct, и мне очень нравится, как он работает. Поскольку я новичок в MapStruct, заранее прошу прощения, если этот вопрос глупый или имеет мало смысла.
Из-за версии сервера я связан с Java 6.
У меня есть 3 типа сущностей, A, B и C, а также их аналоги DTO.
public class A{
//...
}
public class B extends A{
//...
}
public class C extends A{
//...
}
public class ADto{
//...
}
public class BDto extends ADto{
//...
}
public class CDto extends ADto{
//...
}
Мой картограф определяет:
public abstract ADto mapAToADto(A source);
public abstract A mapADtoToA(ADto source);
public abstract BDto mapBToBDto(B source);
public abstract B mapBDtoToB(BDto source);
public abstract CDto mapCToCDto(C source);
public abstract C mapCDtoToC(CDto source);
Который пока работает отлично.
В моем приложении я работаю с List<A>
а также List<ADto>
который содержит оба подтипа.
Моя текущая реализация заключалась в реализации моего собственного метода отображения, который перебирает список источников и проверяет типы с помощью instanceof
, затем вызывает метод сопоставления, указанный выше.
Текущая реализация:
public <T extends ADto, S extends A> List<T> toList(List<S> source) {
if (source == null) {
return null;
}
List<T> list = new ArrayList<T>();
for (S entity : source) {
if (entity instanceof B) {
list.add((T) mapBToBDto((B) entity));
} else if (entity instanceof C) {
list.add((T) mapCToCDto((C) entity));
} else {
list.add((T) mapADtoToA((A) entity));
}
}
return list;
};
Мне было интересно, есть ли способ заставить MapStruct выяснить это автоматически. Я что-то пропустил?
Изменить: мой оптимистический подход был с:
@IterableMapping(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL)
public abstract <T extends ADto, S extends A> List<T> listAToADto(List<S> source);
Что приводит к:
Не удается сгенерировать метод отображения для целевой переменной универсального типа
Спасибо
1 ответ
Ваша реализация верна. MapStruct - это процессор аннотаций, который генерирует код во время компиляции. Мы не генерируем никаких проверок отражения (все типы, которые реализуют и взаимодействуют или расширяют класс, не известны во время компиляции). Поэтому ваш подход к проблеме правильный.