Kotlin中使用MapStruct映射抽象类遇返回类型错误的解决方法咨询
解决Kotlin中MapStruct映射抽象类的报错问题
这个报错的核心原因有两个:一是你的Kotlin代码里mapToAnimalOutput方法的逻辑有漏洞,二是旧版本MapStruct对Kotlin接口默认方法的支持存在问题。咱们一步步来解决:
首先修复代码逻辑漏洞
你当前的when分支里没有返回值,导致哪怕输入是DogInput或CatInput,代码执行完分支后还是会走到抛出异常的语句。先把这个逻辑修正,确保每个分支都能正确返回对应的输出对象:
fun mapToAnimalOutput(animalInput: AnimalInput): AnimalOutput { return when (animalInput) { is DogInput -> mapToDogOutput(animalInput) is CatInput -> mapToCatOutput(animalInput) else -> throw RuntimeException("Unsupported animal type") } }
方案1:将Mapper改为抽象类(推荐,兼容旧版MapStruct)
MapStruct对Kotlin接口的默认方法识别不太友好,它会误以为你需要它生成mapToAnimalOutput的实现,但返回类型AnimalOutput是抽象类,所以报错。把Mapper改成抽象类,MapStruct就会直接继承你写的具体方法,不会再尝试生成新的实现:
@Mapper(componentModel = "jsr330") abstract class AnimalMapper { // 让MapStruct生成这两个方法的实现 abstract fun mapToDogOutput(dogInput: DogInput): DogOutput abstract fun mapToCatOutput(catInput: CatInput): CatOutput // 这个方法用你自己的实现 fun mapToAnimalOutput(animalInput: AnimalInput): AnimalOutput { return when (animalInput) { is DogInput -> mapToDogOutput(animalInput) is CatInput -> mapToCatOutput(animalInput) else -> throw RuntimeException("Unsupported animal type") } } }
方案2:升级MapStruct版本(保留接口形式)
如果你更习惯用接口,可以升级MapStruct到1.5.3.Final及以上版本——新版本修复了对Kotlin接口默认方法的识别问题,会直接使用你提供的默认实现,而不是尝试生成新的代码。
修改依赖版本(以Gradle为例):
mapstructVersion = "1.5.3.Final"
然后用修正过返回逻辑的接口代码即可:
@Mapper(componentModel = "jsr330") interface AnimalMapper { fun mapToDogOutput(dogInput: DogInput): DogOutput fun mapToCatOutput(catInput: CatInput): CatOutput fun mapToAnimalOutput(animalInput: AnimalInput): AnimalOutput { return when (animalInput) { is DogInput -> mapToDogOutput(animalInput) is CatInput -> mapToCatOutput(animalInput) else -> throw RuntimeException("Unsupported animal type") } } }
两种方案都能解决你遇到的错误,编译后MapStruct会正确生成子类映射方法,同时mapToAnimalOutput会根据输入类型返回对应的具体输出实例。
内容的提问来源于stack exchange,提问作者PAK
相关产品推荐
相关产品推荐

