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,提问作者Вячеслав Чернышов
相关产品推荐
相关产品推荐

