我目前正在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
}
2条答案
按热度按时间gwbalxhn1#
Kotlin接口中已实现的方法没有标记为已实现,因此MapStruct认为该方法是抽象的,需要实现。
为了使这些工作正常进行,您需要使用
@JvmDefault
注解该方法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