Spring Boot Kotlin- Mapstruct - @AfterMapping只能应用于已实现的类

d6kp6zgx  于 2023-02-22  发布在  Spring
关注(0)|答案(2)|浏览(109)

我目前正在Kotlin上开发一个mapstructMap,它有某种关系,使用Sping Boot 存储库和服务来获取对象以便进一步处理,但是,我无法实现@AfterMapping

@Mapper(componentModel = "spring")
interface Objectmapper {

  @Mappings(
    Mapping(source = "aCode", target = "a.code"),
    Mapping(source = "bCode", target = "b.code")
  )
  fun convertFormDtoToEntity(
    dto: ObjectFormDto,
    @Context aRepo: ARepository,
    @Context bService: BService
  ): Object

  @AfterMapping
  fun afterMappingFormDtoToEntity(
    dto: ObjectFormDto,
    @Context aRepo: ARepository,
    @Context bService: BService,
    @MappingTarget object: Object
  ){
    object.a = aRepo.findByA(object.a.code)
    object.b = bService.getB(object.b.code)
  }
}

我的目标是在convertFormToEntity()上的Map完成后实现afterMappingFormDtoToEntity(),但是我无法完成kaptKotlin作业并返回错误

error: @AfterMapping can only be applied to an implemented class
    public abstract void afterMappingFormDtoToEntity(@org.jetbrains.annotations.NotNull()...

我当前的mapstruct版本是“1.5.2.Final”,kapt版本是“1.6.10”,build.gradle.kts中有以下kapt设置

kapt {
    arguments {
        arg("mapstruct.unmappedTargetPolicy", "IGNORE")
    }
    keepJavacAnnotationProcessors = true
}
gwbalxhn

gwbalxhn1#

Kotlin接口中已实现的方法没有标记为已实现,因此MapStruct认为该方法是抽象的,需要实现。
为了使这些工作正常进行,您需要使用@JvmDefault注解该方法

a14dhokn

a14dhokn2#

通过改变Map器类型解决了该问题
interface Objectmapper转换为abstract class ObjectMapper,并将除@AfterMapping方法外的所有方法转换为抽象
细节写在我的Medium博客文章中:https://3lexw.medium.com/how-to-use-mapstruct-in-kotlin-spring-with-injection-spring-services-and-repositories-5c3f468ee261

相关问题