如何使用 Mapstruct 和 Kotlin 在另一个映射器中使用映射器?

时间:2021-02-05 23:30:27

标签: java spring kotlin mapstruct

我想在 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 实现?

1 个答案:

答案 0 :(得分:2)

差别不大。纯粹的语法差异。

@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;
    }
}