2 回答

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個(gè)贊
自從我提出這個(gè)問(wèn)題以來(lái)已經(jīng)一年多了,但現(xiàn)在我們已經(jīng)在 MapStruct 項(xiàng)目本身中找到了答案 - MapStruct Spring Extensions項(xiàng)目。
項(xiàng)目中提供了一個(gè)示例作為示例CarMapper
。

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

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊
坦率地說(shuō),我懷疑您是否可以ConversionService通過(guò) . 實(shí)現(xiàn)自動(dòng)連接到生成的映射器MapStruct。您在問(wèn)題中描述的方式(通過(guò)注釋屬性連接各個(gè)映射器)可能是開(kāi)箱即用的uses最佳方式。MapStruct
但是,如果您絕對(duì)需要使用某些 DTO 執(zhí)行轉(zhuǎn)換ConversionService(例如,如果您有一些舊版轉(zhuǎn)換器,但您不想重構(gòu)映射器),則可以使用解決方法。基本上,您可以使用靜態(tài)工廠的組合來(lái)獲取映射器接口中的Mappers.getMapper實(shí)例ConversionService和方法,以使用實(shí)例: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;
}
}
注意:如您所見(jiàn),解決方法需要編寫(xiě)CarMapper代碼。因此,在我看來(lái),帶有注釋屬性的解決方案uses是更干凈的方法。例如,通過(guò)定義以下接口,您可以獲得幾乎相同的結(jié)果:
@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;
}
}
添加回答
舉報(bào)