Spring boot 列表映射到列表

Spring boot 列表映射到列表,spring-boot,kotlin,mapstruct,Spring Boot,Kotlin,Mapstruct,我正在学习如何在Spring Boot和Kotlin项目中使用Mapstruct 我有一个生成的DTO ThessaurusDTO,它有一个列表,我需要将它映射到我的模型Vocab上的列表中 MapStruct无法自动映射这一点是有道理的,但我知道第一个列表的大小始终为1。我无法控制DTO模型所属的API。 我在上发现,我可以在接口中创建并定义一个默认方法实现,这将松散地转换为Kotlin中的正常函数 我的映射器界面: @Mapper interface VocabMapper { @

我正在学习如何在Spring Boot和Kotlin项目中使用Mapstruct

我有一个生成的DTO ThessaurusDTO,它有一个列表,我需要将它映射到我的模型Vocab上的列表中

MapStruct无法自动映射这一点是有道理的,但我知道第一个列表的大小始终为1。我无法控制DTO模型所属的API。 我在上发现,我可以在接口中创建并定义一个默认方法实现,这将松散地转换为Kotlin中的正常函数

我的映射器界面:

@Mapper
interface VocabMapper {

    @Mappings(
            // ...
    )
    fun thessaurusToVocab(thessaurusDTO: ThessaurusDTO): Vocab

    fun metaSyns(nestedList: List<List<String>>): List<String> 
             = nestedList.flatten()
}
当我尝试进行构建时,会出现以下错误:

VocabMapper.java:16: error: Can't map collection element "java.util.List<java.lang.String>" to "java.lang.String ". Consider to declare/implement a mapping method: "java.lang.String map(java.util.List<java.lang.String> value)".

看起来mapStruct仍在尝试自动执行映射,而忽略了我的自定义实现。我在这里遗漏了一些琐碎的东西吗?

我已经看到,通过依赖基于抽象的实现,而不是使用接口,解决了这个问题。 根据我在网上发现的情况,Kotlin没有正确地将接口函数转换为Java中的默认方法,而是实际生成了一个实现该接口的类

我在文档中发现,我可以在接口中创建并定义一个默认方法实现,它可以松散地转换为Kotlin中的正常函数

根据我在网上发现的情况,Kotlin没有正确地将接口函数转换为Java中的默认方法,而是实际生成了一个实现该接口的类

如果这是问题所在,可以使用以下注释元同步:

指定应为非抽象Kotlin接口成员生成JVM默认方法

此注释的用法需要指定一个显式编译参数-Xjvm default=enable或-Xjvm default=compatibility


请参阅链接了解区别,但您可能需要-Xjvm default=enable。

这是正确的方法。仅供参考,以防某些功能仍然无法正常工作。请查看Kotlin注释处理中存在的错误,以便它不会将所有内容都公开给注释处理器