You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中继承带@Autowired构造函数的抽象类的注入问题

解决AbstractMapper子类构造参数缺失的问题

你遇到的这个错误是因为Kotlin子类继承时,默认会调用父类的主构造函数,但你的AbstractMapper主构造需要一个ModelMapper参数,而子类UserParamsMapper的构造没有传递这个参数,所以IDE报错。下面给你几种可行的解决办法:

方法一:子类构造显式传递依赖(推荐)

遵循Spring构造注入的最佳实践,让子类也通过构造注入ModelMapper,然后传递给父类。这样依赖关系清晰,也方便单元测试时传入Mock对象:

class UserParamsMapper @Autowired constructor(mapper: ModelMapper) : AbstractMapper<UserParams, UserParamsDto>(mapper)

Spring会自动将容器中的ModelMapper Bean注入到子类的构造函数中,再传递给父类,这样就解决了参数缺失的问题。

方法二:父类改用字段注入(简单但不推荐)

如果你不想让子类每次都传递参数,可以把父类的依赖注入方式改成字段注入。不过这种方式的缺点是依赖关系不明确,单元测试时需要额外处理:

open class AbstractMapper<E : AbstractEntity, D : AbstractDto> : EntityDtoMapper<E, D> {
    @Autowired
    protected lateinit var mapper: ModelMapper
}

这样子类就可以直接继承,不需要传递任何参数:

class UserParamsMapper : AbstractMapper<UserParams, UserParamsDto>()

关键注意事项

不管用哪种方法,都要确保你的ModelMapper已经被正确注册为Spring Bean。可以在配置类中添加如下代码:

@Configuration
class MapperConfig {
    @Bean
    fun modelMapper(): ModelMapper {
        val mapper = ModelMapper()
        // 这里可以添加自定义的映射配置,比如字段匹配规则、类型转换器等
        return mapper
    }
}

这样Spring容器中才会有可用的ModelMapper实例供注入使用。

内容的提问来源于stack exchange,提问作者Вячеслав Чернышов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:04:42