Основываясь на комментариях в вопросе, я понимаю немного больше, что нужно сделать. Основываясь на некоторых входных параметрах, необходимо создать различные методы отображения.
Не уверен, насколько сложна ваша логика c. Тем не менее, вы можете создать собственный процессор аннотаций, который мог бы создавать картографы MapStruct.
Давайте представим, что у вас есть
@CustomMapper
public interface MyMapper {
@CustomMapping(version = "1.0", mappings = {
@Mapping(source = "numberOfSeats", target = "seatCount", qualifiedByName="")
})
@CustomMapping(version = "2.0", mappings = {
@Mapping(source = "numberOfSeats", target = "seats", qualifiedByName="")
})
CarDto map(Car car, String version);
}
Так что ваш процессор аннотаций должен будет обрабатывать CustomMapper
.
Процессор также будет генерировать разные версионные интерфейсы MapStruct.
Итак:
@Mapper
public interface MyMapperV1 {
@Mapping(source = "numberOfSeats", target = "seatCount", qualifiedByName="")
CarDto map(Car car)
}
@Mapper
public interface MyMapperV2 {
@Mapping(source = "numberOfSeats", target = "seats", qualifiedByName="")
CarDto map(Car car)
}
И дополнительно реализация MyMapper
. Это выглядит так:
public class MyMapperImpl {
protected MyMapperV1 myMapperV1 = Mappers.getMapper(MyMapperV1.class):
protected MyMapperV2 myMapperV2 = Mappers.getMapper(MyMapperV2.class):
public CarDto map(Car car, String version) {
if ("1.0".equals(version)) {
return myMapperV1.map(car);
} else {
return myMapperV2.map(car);
}
}
}
По сути, цель состоит в том, чтобы ваш процессор генерировал интерфейсы, которые будут задействованы MapStruct в одном раунде компиляции. Это возможно при обработке аннотаций.
Другой вариант - написать мапперы MapStruct самостоятельно и в месте вызова выбрать тот, который подходит для версии. Это может быть проще на самом деле.