Я хотел бы объединить MapStruct
картографы с моделью преобразования Spring * .Поэтому я объявляю каждый Mapper
интерфейс как расширение Converter
:
@Mapper
public interface CarMapper extends Converter<Car, CarDto> {
@Override
CarDto convert(Car car);
}
в Spring. Затем я могу использовать компоненты mapper, вводя стандартный ConversionService
:
class CarWarehouse {
@Autowired
private ConversionService conversionService;
...
public CarDto getCarInformation(Car car) {
return conversionService.convert(car, CarDto.class);
}
}
Это хорошо работает, но мне интересно, есть ли способ избежать внедрения некоторых Mappers в другие напрямую через атрибут uses
.То, что я хотел бы сделать, это сказать маперу use
ConversionService
для использования другого маппера.Однако, так как метод ConversionService
convert
не соответствует стандартному шаблону MapStruct для метода отображения, плагин генерации кода не распознает, что он может использовать сервис при поиске суб-отображения.По сути, я хочу написать
@Mapper(uses=ConversionService.class)
public interface ParentMapper extends Converter<Parent, ParentDto>
вместо
@Mapper(uses={ChildMapper1.class, ChildMapper2.class, ChildMapper3.class})
public interface ParentMapper extends Converter<Parent, ParentDto>
Есть ли способ добиться этого?
Редактировать
Так как его спросили, скажем, у меня есть CarMapper
, определенный как выше, с типами Car
и CarDto
, имеющими атрибут wheel
типа Wheel
и WheelDto
соответственно.Тогда я хотел бы иметь возможность определить другой Mapper как это:
@Mapper
public interface WheelMapper extends Converter<Wheel, WheelDto> {
@Override
WheelDto convert(Wheel wheel);
}
Прямо сейчас, я должен был бы добавить этот Mapper явно:
@Mapper(uses = WheelMapper.class)
public interface CarMapper extends Converter<Car, CarDto>
, который бы затем далсгенерированный CarMapperImpl
an @Autowired
член типа WheelMapper
, который будет вызван для сопоставления атрибута wheel
.
Однако, мне бы хотелось, чтобы сгенерированный код выглядел несколькокак это:
@Component
public class CarMapperImpl implements CarMapper {
@Autowired
private ConversionService conversionService;
@Override
public CarDto convert(Car car) {
CarDto carDto = new CarDto();
carDto.setWheel(conversionService.convert(car.getWheel(), WheelDto.class);
return carDto;
}
}