mapstruct 仅当源 bean 和目标 bean 都使用 lombok 为父级时才转换父级字段

问题描述 投票:0回答:1

如下所示,我有扩展 BasicEntity 的 OpenSecretEntity 和扩展 BasicDto 的 OpenSecretDto 。

当我使用 OpenSecretStructMapper 和 mapstruct 的 @Mapper 将 OpenSecretEntity 转换为 OpenSecretDto 时,mapstruct 的实现仅涉及 BasicEntity 中的字段。

我该如何修复它?谢谢

基本实体:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class BasicEntity {

    private Long id;
    private Date createAt;
    private String createBy;
    private Date updateAt;
    private String updateBy;
}

秘密实体:

@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OpenSecretEntity extends BasicEntity {
    private Long id;
    private String secretId;
    private String secretKey;
    private String remark;
    private Boolean enabled;
    private Date effectStart;
    private Date effectEnd;
}

基本Dto:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class BasicDto {
    private Long id;
    private String createBy;
    private Date createAt;
    private String updateBy;
    private Date updateAt;
}

秘密D:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class OpenSecretDto extends BasicDto {

    private String remark;
    private String secretId;
    private String secretKey;
    private Date effectStart;
    private Date effectEnd;

}

地图结构

@Mapper(componentModel = "spring")
public interface OpenSecretStructMapper {

    OpenSecretDto toDto(OpenSecretEntity entity);

}

SecretStructMapper的实现


@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2023-06-29T11:30:42+0800",
    comments = "version: 1.5.3.Final, compiler: javac, environment: Java 11.0.18 (Oracle Corporation)"
)
@Component
public class OpenSecretStructMapperImpl implements OpenSecretStructMapper {

    @Override
    public OpenSecretDto toDto(OpenSecretEntity entity) {
        if ( entity == null ) {
            return null;
        }

        if (entity instanceof OpenSecretEntity) {
            return openSecretEntityToOpenSecretDto( (OpenSecretEntity) entity );
        }
        else {
            OpenSecretDto openSecretDto = new OpenSecretDto();

            openSecretDto.setId( entity.getId() );
            openSecretDto.setCreateBy( entity.getCreateBy() );
            openSecretDto.setCreateAt( entity.getCreateAt() );
            openSecretDto.setUpdateBy( entity.getUpdateBy() );
            openSecretDto.setUpdateAt( entity.getUpdateAt() );

            return openSecretDto;
        }
    }

    @Override
    public OpenSecretEntity toEntity(OpenSecretDto openSecretDto) {
        if ( openSecretDto == null ) {
            return null;
        }

        OpenSecretEntity openSecretEntity = new OpenSecretEntity();

        openSecretEntity.setId( openSecretDto.getId() );
        openSecretEntity.setCreateAt( openSecretDto.getCreateAt() );
        openSecretEntity.setCreateBy( openSecretDto.getCreateBy() );
        openSecretEntity.setUpdateAt( openSecretDto.getUpdateAt() );
        openSecretEntity.setUpdateBy( openSecretDto.getUpdateBy() );

        return openSecretEntity;
    }

    protected OpenSecretDto openSecretEntityToOpenSecretDto(OpenSecretEntity openSecretEntity) {
        if ( openSecretEntity == null ) {
            return null;
        }

        OpenSecretDto openSecretDto = new OpenSecretDto();

        openSecretDto.setId( openSecretEntity.getId() );
        openSecretDto.setCreateBy( openSecretEntity.getCreateBy() );
        openSecretDto.setCreateAt( openSecretEntity.getCreateAt() );
        openSecretDto.setUpdateBy( openSecretEntity.getUpdateBy() );
        openSecretDto.setUpdateAt( openSecretEntity.getUpdateAt() );

        return openSecretDto;
    }
}

我希望mapstruct能够将OpenSecretEntity中的所有字段(包括BasicEntity中的字段)转换为OpenSecretDto。 但我不知道该怎么做。

inheritance lombok mapstruct
1个回答
0
投票

要还包含 BasicEntity 中的字段,您需要配置映射器:

MapStruct 文档:共享配置

本质上,您需要创建一个 BaseMapperConfig,在其中将 BaseEntity 映射到 BaseDto,然后配置 OpenSecretStructMapper 以使用 BaseMapperConfig。

相反,如果您在使用 lombok 和 mapstruct 时遇到问题,您可以检查:

Mapstruct 文档:lombok

© www.soinside.com 2019 - 2024. All rights reserved.