gpt4 book ai didi

java - 从多个源 DTO 映射到一个目标

转载 作者:行者123 更新时间:2023-12-04 17:51:02 25 4
gpt4 key购买 nike

使用 MapStruct。举个例子:

class Dto {
DtoA a;
DtoB b;
}

class DtoA {
Long id;
//...
}

class DtoB {
Long id;
//...
}


class Entity {
AB ab;
}

我如何映射 DtoADtoB 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丢失了。

最佳答案

据我了解您要映射EntityDto并合并两个字段 Dto.aDto.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;
}
}

关于java - 从多个源 DTO 映射到一个目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53153184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com