【问题标题】:Mapstruct @Mapping(expression="...") in kotlinkotlin 中的 Mapstruct @Mapping(expression="...")
【发布时间】:2021-10-25 15:59:23
【问题描述】:

是否可以在@Mapping注解中表达Kotlin表达式?

(简化的)问题如下:

我有这个数据类:

data class Data (
    val myClass: MyClass
)

和:

data class DataDto (
    myString: String
)

fun String.toMyClass() = ...

目前我想做这样的事情:

@Mapper
interface RefDataMapper {

    @Mapping(expression = "kotlin(myString?.toMyClass())", target = "myClass")
    fun toDomain(dataDto: DataDto) : Data

}

目前看来,表达式只能用 Java 编写,因此上述解决方案不起作用。有可能做我想做的事吗?

注意我无法使用装饰器,因为在 Data 类中,此属性设置为 val,因此,我只能在实例化期间设置此属性。

【问题讨论】:

    标签: kotlin mapstruct


    【解决方案1】:

    MapStruct 不支持 Kotlin 表达式,因为 MapStruct 目前只能生成 Java 代码。因此,即使您的映射器是在 Kotlin 中定义的,映射器的实现也会用 Java 编写。

    您必须调整您的表达式以使用java(...) 格式。

    【讨论】:

    • 是的,这似乎是唯一的解决方案。我想在 Kotlin 项目中使用 mapstruct 并不方便。对于更复杂的表达,我会使用 Kotlin 提供的功能在简洁等方面......
    • 你总是可以使用自定义方法和限定符来执行自定义映射。不需要总是使用表达式
    • 你能说清楚一点吗?我的意思是,正如我在线程中所写的,我无法使用装饰器自定义映射,因为我的示例中的字段在创建后无法修改。所以我必须在创建实例的过程中进行初始化。这就是为什么我想到了表达。但我有一个替代方案,我会检查你的答案。我的目标是将方法 toMyClass 应用于 DTO 中的字段以填充域对象中的字段。
    • 编写自定义映射方法不使用装饰器。它与使用表达式相同,但编写正确。检查mapstruct.org/documentation/stable/reference/html/…
    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2022-10-16
    • 2022-07-06
    • 2021-10-19
    • 2021-11-28
    • 2021-09-23
    相关资源
    最近更新 更多