Spring Autowire Hashmap在Kotlin中不起作用

时间:2019-03-29 13:29:37

标签: spring spring-boot kotlin dependency-injection

我正在将应用程序移至kotlin,并且其中一个文件具有用于实施策略模式的自动接线图。当我将此文件更改为kotlin时,春天就要注入豆了

我已经尝试过Lateinit,@ jvmfield等。我一直在进行更改,并查看生成的反编译的java,以查看其是否清楚为什么存在错误。它看起来像是因为Java版本中的哈希图没有显示类型。

 Hashmap vs HashMap<String,Object>

更改前的Java版本。这收集了AudienceService类型的所有bean,并将它们注入到该地图中

@Autowired
    private Map<String, AudienceService> audienceServiceMap = new HashMap<>();

科特林版本:

    @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,

1 个答案:

答案 0 :(得分:2)

如果您将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