Spring Autowire Hashmap не работает в kotlin - PullRequest
0 голосов
/ 29 марта 2019

Я перемещаю свое приложение в kotlin, и в одном из моих файлов есть карта автопровода для реализации шаблона стратегии. Когда я меняю этот файл на kotlin

, приходит весна, чтобы ввести бобы

Я уже пробовал lateinit, @jvmfield и другие. Я вносил изменения и смотрел на получившуюся декомпилированную Java, чтобы понять, понятно ли, почему произошла ошибка. Похоже, потому что хэш-карта в версии Java не имеет типа показа.

 Hashmap vs HashMap<String,Object>

Версия Java до изменения. Это собрало все компоненты типа AudienceService и вставило их в эту карту

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

Kotlin версия:

    @Autowired
    private lateinit var audienceServiceMap : HashMap<String, AudienceService>

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 Ответ

2 голосов
/ 29 марта 2019

Если вы ссылаетесь на audienceServiceMap как Map<String, AudienceService> вместо HashMap<...>, Spring будет легче найти ваш боб и ввести его. Как правило, это хорошая идея программировать интерфейс, а не реализацию .

Не видя, где вы объявляете Бин audienceServiceMap, я только догадываюсь, но я подозреваю, что Spring считает его Map, а не (Java) HashMap, потому что вы делаете что-то вроде этого:

@Bean
fun audienceServiceMap() = mapOf(...)

Делая это (или что-то подобное), Spring видит audienceServiceMap как Map, а не более конкретный HashMap.

...