当前位置: 首页 > 知识库问答 >
问题:

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

楚建柏
2023-03-14

我想用Kotlin中的Mapstruct将实体映射到带有嵌套DTO的DTO。

data class FirstDto (
    val something: String
)
@Mapper(componentModel = "spring")
interface FirstMapper {

    fun entityToDto(entity: FirstEntity): FirstDto

    fun dtoToEntity(dto: FirstDto): FirstEntity
}
data class SecondDto (
    val somethingElse: String,
    val firstDto: FirstDto
)

在Java中,这是这样的:@mapper(componentModel=“spring”,uses=firstmapper.class)

应该如何使用Kotlin实现它?

共有1个答案

袁翔
2023-03-14

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

@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;
    }
}
 类似资料:
  • 我在我的项目中使用了mapstruct,它可以直接工作(所有的mapper都在一个包中)。现在我有了将一个映射器移动到另一个包的要求,但这并不能很好地工作。 你能帮我解决这个问题吗? 编辑包结构1的结果CarMapperImpl.java:

  • 是否可能在MapStruct中使用不同的映射器?我有这个映射器 是否可以将此实现更改为MapStruct?

  • 我想把一个模型对象映射到dto模型。我已经有一个对象的映射器。我如何在另一个类中的另一个映射器中重用这个映射器? 我有下面的模型 这是我的地图 我希望将History映射到HistoryDynamo并重用IdentifierMapper映射HistoryDynamo中的一个对象。如何在ToHistoryDynamo中使用toIdentifierDynamo?

  • 我有一个映射器,对于目标类的特定属性,需要从源对象内的对象列表中选择一个,并使用不同的映射器类对其进行映射。 简化了很多,类包含一个对象列表,我的类如下所示: 问题是,被生成为中的code>属性,但不是,因此生成失败,因为MapStruct找不到。 我最好的猜测是,这是由于在中没有其他方法显式地使用,因此Mapstrt决定不需要它,并且没有在实现中注入它。 那么,是否有任何方法可以强制MapSTR

  • 我不熟悉Mapstruct,在特定用例中遇到问题 因此,如果我的来源属性hotmail.com我的目标属性应该收到“个人”,如果我的来源facebook.com我的目标应该收到“公司”。 我想用表达法,但没法绕过它。我该怎么做?

  • 我刚刚开始看Java8,为了尝试lambdas,我想我应该尝试重写我最近写的一个非常简单的东西。我需要将一个字符串到列的映射转换为另一个字符串到列的映射,其中新映射中的列是第一个映射中列的防御副本。列具有复制构造函数。到目前为止我得到的最接近的数据是: 但我相信一定有更好的方法来做这件事,我会很感激一些建议。