Полагаю, Spring не знает, какой Map<String, Object>
ввести. Попробуйте добавить @Qualifier("kafkaProps")
к параметру kafkaProps
:
@Bean
public ReceiverOptions<String, String> receiverOptions(@Qualifier("kafkaProps") Map<String, Object> kafkaProps) {
// ...
}
ОБНОВЛЕНИЕ
Странная вещь, после добавления @Qualifier
Пружины kafkaProps
в другое карта ...
Пока что, возможно, просто используйте Свойства вместо Карты:
@Bean
public Properties kafkaProps() {
Properties props = new Properties();
props.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
props.setProperty(ConsumerConfig.GROUP_ID_CONFIG, DemoApplication.class.getSimpleName());
return props;
}
@Bean
public ReceiverOptions<String, String> receiverOptions(@Qualifier("kafkaProps") Properties kafkaProps) {
// ...
}
ОБНОВЛЕНИЕ 2
Относительно странного Map<String, Object>
инъекция: на самом деле это не так странно. Map<String, SomeType>
, когда вводится по типу, обрабатывается особым образом: он собирает все бины типа MyType
(ключи - это имена бинов). Так что в вашем случае Map<String, Object>
- это карта всех компонентов в контексте, которая, очевидно, заканчивается круговой ссылкой. То же самое произошло бы для List<Object>
или Set<Object>
. Добавление аннотации @Qualifier не меняет это поведение, но фильтрует компоненты. Таким образом, карта kafkaProps
является единственным компонентом, проходящим через фильтр, и кажется, что она «обернута» в другую карту.
Даже экземпляры типизированной карты могут быть автоматически подключены, пока ожидается тип ключа Строка. Значения карты содержат все bean-компоненты ожидаемого типа, а ключи содержат соответствующие имена bean-компонентов (...)
Переключение на внедрение по имени должно решить проблему. Обычно это можно сделать, добавив @Resource(name = "kafkaProps")
вместо (неявной) аннотации @Autowired
, но, к сожалению, аннотацию @Resource
нельзя добавить к параметру метода.
Однако существует другое решение. Поскольку оба bean-компонента объявлены в одном и том же @Configuration
классе, вы можете напрямую вызвать kafkaProps()
. Spring будет возвращать один и тот же bean-компонент, а не новый экземпляр при каждом вызове (осторожно, он не поддерживается для методов stati c)
@Bean
public ReceiverOptions<String, String> receiverOptions() {
return ReceiverOptions.<String, String>create(kafkaProps())
...
}
Ссылки: