Возможно ли, чтобы 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 - это процессор аннотаций, который генерирует код во время компиляции. Мы не генерируем никаких проверок отражения (все типы, которые реализуют и взаимодействуют или расширяют класс, не известны во время компиляции). Поэтому ваш подход к проблеме правильный.

Другие вопросы по тегам