【问题标题】:How to use a mapper in another mapper using Mapstruct and Kotlin?如何使用 Mapstruct 和 Kotlin 在另一个映射器中使用映射器?
【发布时间】:2021-05-10 07:24:20
【问题描述】:

我想在 Kotlin 中使用 Mapstruct 将实体映射到具有嵌套 DTO 的 DTO

我的第一个 DTO 定义如下:

data class FirstDto (
    val something: String
)

此 DTO 使用 Mapstruct 映射到实体中,反之亦然。这是映射器:

@Mapper(componentModel = "spring")
interface FirstMapper {

    fun entityToDto(entity: FirstEntity): FirstDto

    fun dtoToEntity(dto: FirstDto): FirstEntity
}

第二个 DTO 嵌套第一个 DTO:

data class SecondDto (
    val somethingElse: String,
    val firstDto: FirstDto
)

至于第一个 DTO,我使用 Mapstruct 定义了一个 Mapper。但是,我希望这个映射器使用 FirstMapper 来映射嵌套的 DTO。所以我应该使用 Mapperuses 属性。

在 Java 中,如下所示:@Mapper(componentModel = "spring", uses = FirstMapper.class)

应该如何使用 Kotlin 来实现?

【问题讨论】:

    标签: java spring kotlin mapstruct


    【解决方案1】:

    差别不大。纯语法差异。

    @Mapper(componentModel = "spring", uses = [FirstMapper::class])
    interface SecondMapper {
       @Mapping(source = "firstEntity", target = "firstDto")
       fun entityToDto(entity: SecondEntity): SecondDto
    
       @Mapping(source = "firstDto", target = "firstEntity")
       fun dtoToEntity(dto: SecondDto): SecondEntity
    }
    

    生成

    public class SecondMapperImpl implements SecondMapper {
        private final FirstMapper firstMapper = Mappers.getMapper(FirstMapper.class);
    
        @Override
        public SecondDto entityToDto(SecondEntity entity) {
            ...
    
            firstDto = firstMapper.entityToDto(entity.getFirstEntity());
            somethingElse = entity.getSomethingElse();
            SecondDto secondDto = new SecondDto(somethingElse, firstDto);
            return secondDto;
        }
    
        @Override
        public SecondEntity dtoToEntity(SecondDto dto) {
            ...
    
            firstEntity = firstMapper.dtoToEntity(dto.getFirstDto());
            somethingElse = dto.getSomethingElse();
            SecondEntity secondEntity = new SecondEntity(somethingElse, firstEntity);
            return secondEntity;
        }
    }
    

    【讨论】:

    • 感谢您向我展示语法和非常详细的答案。像魅力一样工作!
    • @LppEdd 我正在做一些非常相似的事情,但是我在运行单元测试时看到了 NPE。例如运行单元来创建/更新 DTO,它说 firstMapper 为空。
    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多