亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從多個源 DTO 映射到一個目標

從多個源 DTO 映射到一個目標

皈依舞 2021-12-30 17:38:16
使用 MapStruct。舉個例子:class Dto {    DtoA a;    DtoB b;}class DtoA {    Long id;    //...}class DtoB {    Long id;    //...}class Entity {    AB ab;}我如何映射DtoA和DtoB到 AB ?我試過:public abstract Entity toEntity(Dto dto);@Mappings({            @Mapping(source = "a", target = "ab.a"),            @Mapping(source = "b", target = "ab.b"))}public abstract AB toABEntity(DtoA a, DtoB b);盡管已生成代碼*,toABEntity但未調用該方法。*糟糕的是,因為它首先a設置然后設置b創建了一個新的實例ab,所以a丟失了。
查看完整描述

1 回答

?
手掌心

TA貢獻1942條經驗 獲得超3個贊

據我了解您想要映射Entity到Dto,并結合兩個領域Dto.a,并Dto.b以單場Entity.ab。


通常,當您嘗試這樣做時:


@Mapper

public interface TestMapper {

    @Mappings({

        @Mapping(source = "a.id", target = "ab.aId", qualifiedByName = "toAB"),

        @Mapping(source = "b.id", target = "ab.bId", qualifiedByName = "toAB"),

    })

    Entity toEntity(Dto dto);

}

生成的映射器覆蓋ab每個@Mapping在 中具有目標屬性的實例ab。這顯然是一個錯誤,在 MapStructs GitHub 上有一張票:https : //github.com/mapstruct/mapstruct/issues/1148


不過有一個解決方法:


@Mapper

public interface TestMapper {

    @Mappings({

        @Mapping(source = "dto", target = "ab", qualifiedByName = "toAB"),

    })

    Entity toEntity(Dto dto);


    @Mappings({

        @Mapping(target = "aId", source = "a.id"),

        @Mapping(target = "bId", source = "b.id"),

    })

    AB toAB(Dto dto);

}

我假設AB班級是:


class AB {

    public Long aId;

    public Long bId;

}

生成的映射器代碼:


public class TestMapperImpl implements TestMapper {


    @Override

    public Entity toEntity(Dto dto) {

        if ( dto == null ) {

            return null;

        }


        Entity entity = new Entity();


        entity.ab = toAB( dto );


        return entity;

    }


    @Override

    public AB toAB(Dto dto) {

        if ( dto == null ) {

            return null;

        }


        AB aB = new AB();


        Long id = dtoBId( dto );

        if ( id != null ) {

            aB.bId = id;

        }

        Long id1 = dtoAId( dto );

        if ( id1 != null ) {

            aB.aId = id1;

        }


        return aB;

    }


    private Long dtoBId(Dto dto) {

        if ( dto == null ) {

            return null;

        }

        DtoB b = dto.b;

        if ( b == null ) {

            return null;

        }

        Long id = b.id;

        if ( id == null ) {

            return null;

        }

        return id;

    }


    private Long dtoAId(Dto dto) {

        if ( dto == null ) {

            return null;

        }

        DtoA a = dto.a;

        if ( a == null ) {

            return null;

        }

        Long id = a.id;

        if ( id == null ) {

            return null;

        }

        return id;

    }

}


查看完整回答
反對 回復 2021-12-30
  • 1 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號