第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

MapStruct Mapper 作為 Spring Framework 可以慣用使用嗎?

MapStruct Mapper 作為 Spring Framework 可以慣用使用嗎?

紅顏莎娜 2023-08-23 14:33:38
我想將MapStruct映射器與 Spring 的Conversion model結(jié)合起來(lái)。所以我將每個(gè)Mapper接口聲明為 Spring 的擴(kuò)展Converter:@Mapperpublic interface CarMapper extends Converter<Car, CarDto> {        @Override    CarDto convert(Car car);    }然后我可以通過(guò)注入標(biāo)準(zhǔn)來(lái)使用映射器 bean ConversionService:class CarWarehouse {    @Autowired    private ConversionService conversionService;    ...    public CarDto getCarInformation(Car car) {        return conversionService.convert(car, CarDto.class);    }}這很好用,但我想知道是否有一種方法可以避免通過(guò)屬性直接將一些映射器注入其他映射器uses。我想做的是告訴映射器use雇用ConversionService另一個(gè)映射器。但是,由于ConversionServicesconvert方法與 MapStruct 的映射方法標(biāo)準(zhǔn)模式不匹配,因此代碼生成插件在查找子映射時(shí)無(wú)法識(shí)別它可以使用該服務(wù)?;旧?,我想做的是寫(xiě)@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>有辦法實(shí)現(xiàn)這一點(diǎn)嗎?編輯既然有人問(wèn)過(guò),假設(shè)我有一個(gè)CarMapper如上所述的定義,其類(lèi)型Car和分別具有類(lèi)型和的CarDto屬性。然后我希望能夠像這樣定義另一個(gè)映射器:wheelWheelWheelDto@Mapperpublic interface WheelMapper extends Converter<Wheel, WheelDto> {        @Override    WheelDto convert(Wheel wheel);    }現(xiàn)在,我必須顯式添加此映射器:@Mapper(uses = WheelMapper.class)public interface CarMapper extends Converter<Car, CarDto>然后,這將為生成的類(lèi)型提供CarMapperImpl一個(gè)@Autowired成員WheelMapper,該成員將被調(diào)用以映射屬性wheel。然而,我想要的是生成的代碼看起來(lái)有點(diǎn)像這樣:@Componentpublic 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;    }}
查看完整描述

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。


查看完整回答
反對(duì) 回復(fù) 2023-08-23
?
森欄

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)建了所有必要的較小映射器......


查看完整回答
反對(duì) 回復(fù) 2023-08-23
?
冉冉說(shuō)

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;

    }

}


查看完整回答
反對(duì) 回復(fù) 2023-08-23
  • 2 回答
  • 0 關(guān)注
  • 336 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)