列表<列表<String>>映射到列表<String>



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

我有一个生成的DTO(ThessaurusDTO(,它有一个列表,我需要将其映射到我的模型(词汇(上的列表。

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 中的普通函数

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

如果这是问题所在,您可以使用@JvmDefault注释metaSyns

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

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

请参阅链接以了解差异,但您可能需要-Xjvm-default=enable

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

https://github.com/mapstruct/mapstruct/issues/1577

相关内容

最新更新