Spring Autowire Hashmap 在 kotlin 中不起作用
Posted
技术标签:
【中文标题】Spring Autowire Hashmap 在 kotlin 中不起作用【英文标题】:Spring Autowire Hashmap not working in kotlin 【发布时间】:2019-08-20 11:03:02 【问题描述】:我正在将我的应用程序移至 kotlin,并且我的一个文件具有用于实现策略模式的自动装配图。当我将此文件更改为 kotlin 时,Spring 会注入 bean
我已经尝试过lateinit、@jvmfield 等。我一直在进行更改并查看生成的反编译 java,看看它是否清楚为什么会出现错误。看起来它是因为 java 版本中的 hashmap 没有显示类型。
Hashmap vs HashMap<String,Object>
更改前的 Java 版本。这收集了所有 AudienceService 类型的 bean 并将它们注入到这个地图中
@Autowired
private Map<String, AudienceService> audienceServiceMap = new HashMap<>();
Kotlin 版本:
@Autowired
private lateinit var audienceServiceMap : HashMap<String, AudienceService>
上述kotlin代码的Java反编译版
@Autowired
private HashMap audienceServiceMap;
弹簧出错
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'audienceContext': Unsatisfied dependency expressed through field 'audienceServiceMap'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.HashMap<java.lang.String,
【问题讨论】:
将您的HashMap
引用更改为 Map
。
好吧,不知何故起作用了!!。但是 java 版本仍然没有显示 Map如果您将audienceServiceMap
称为Map<String, AudienceService>
而不是HashMap<...>
,Spring 将更容易找到您的bean 并注入它。一般来说,program to an interface and not an implementation 是个好主意。
没有看到你在哪里声明 audienceServiceMap
Bean,我只是猜测,但我怀疑 Spring 认为它是 Map
,而不是(Java)HashMap
,因为你做了这样的事情:
@Bean
fun audienceServiceMap() = mapOf(...)
通过这样做(或类似的方式),Spring 将audienceServiceMap
视为Map
,而不是更具体的HashMap
。
【讨论】:
以上是关于Spring Autowire Hashmap 在 kotlin 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在servlet中用spring @Autowire注入Bean
我如何在可运行的 Spring Boot 中使用 @autowire