2 回答

TA貢獻1806條經驗 獲得超5個贊
自從我提出這個問題以來已經一年多了,但現在我們已經在 MapStruct 項目本身中找到了答案 - MapStruct Spring Extensions項目。
項目中提供了一個示例作為示例CarMapper
。

TA貢獻1810條經驗 獲得超5個贊
您可以完全跳過傳遞 a WheelMapper,當您只有 a 時,CarMapper生成的也將包含映射<->CarMapperImpl的邏輯。無需將任何內容傳遞給,使您的問題過時。WheelWheelDtouses
carDto.setWheel( wheelToWheelDto( car.getWheel() ) );
用類似的方法;
protected WheelDto wheelToWheelDto(Wheel wheel) {
if ( wheel == null ) {
return null;
}
WheelDto wheelDto = new WheelDto();
wheelDto.setName( wheel.getName() );
return wheelDto;
}
我確實嘗試過實現ConversionServicethrough的智能注入MapStruct,但我認為這是不可能的。您需要來自的支持MapStruct才能實現這樣的壯舉。它甚至不考慮注入ConversionService。也許已經實現并使用的自定義通用映射器ConversionService可能會起作用,但我無法做到這一點!雖然我沒有看到任何原因,因為MapStruct已經從父映射器創建了所有必要的較小映射器......

TA貢獻1877條經驗 獲得超1個贊
坦率地說,我懷疑您是否可以ConversionService通過 . 實現自動連接到生成的映射器MapStruct。您在問題中描述的方式(通過注釋屬性連接各個映射器)可能是開箱即用的uses最佳方式。MapStruct
但是,如果您絕對需要使用某些 DTO 執行轉換ConversionService(例如,如果您有一些舊版轉換器,但您不想重構映射器),則可以使用解決方法。基本上,您可以使用靜態工廠的組合來獲取映射器接口中的Mappers.getMapper實例ConversionService和方法,以使用實例:defaultConversionService
@Mapper(componentModel = "spring")
public interface CarMapper extends Converter<Car, CarDto> {
ConversionService CONVERSION_SERVICE = Mappers.getMapper(ConversionService.class);
@Override
default CarDto convert(Car car) {
if (car == null) {
return null;
}
CarDto carDto = new CarDto();
carDto.setEngine(CONVERSION_SERVICE.convert(car.getEngine(), EngineDto.class));
carDto.setWheel(CONVERSION_SERVICE.convert(car.getWheel(), WheelDto.class));
return carDto;
}
}
注意:如您所見,解決方法需要編寫CarMapper代碼。因此,在我看來,帶有注釋屬性的解決方案uses是更干凈的方法。例如,通過定義以下接口,您可以獲得幾乎相同的結果:
@Mapper(componentModel = "spring",
uses = {EngineMapper.class, WheelMapper.class},
injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface CarMapper extends Converter<Car, CarDto> {
@Override
CarDto convert(Car car);
生成的映射器:
@Component
public class CarMapperImpl implements CarMapper {
private final EngineMapper engineMapper;
private final WheelMapper wheelMapper;
@Autowired
public CarMapperImpl(EngineMapper engineMapper, WheelMapper wheelMapper) {
this.engineMapper = engineMapper;
this.wheelMapper = wheelMapper;
}
@Override
public CarDto convert(Car car) {
if (car == null) {
return null;
}
CarDto carDto = new CarDto();
carDto.setEngine(engineMapper.convert(car.getEngine()));
carDto.setWheel(wheelMapper.convert(car.getWheel()));
return carDto;
}
}
添加回答
舉報