为了账号安全,请及时绑定邮箱和手机立即绑定

从多个源 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 关注
  • 243 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号