我正在将应用程序移至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,
答案 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
。