NoSuchBeanDefinitionException - конструктор SpringBoot с автопроводкой содержит параметр, у которого есть автопроводное объявление, которое не генерируется - PullRequest
1 голос
/ 26 января 2020

У меня есть следующий код:
Это мой первый класс, который будет вызывать

    @Component
    class DefaultBridge @Autowired constructor(
            private val clientConfig: Config,
            private val client: world.example.Client
    ) : Bridge {

        override fun doEpicStuff(): String {
            val request = createRequest(...)
            val response = client.makeCall(request)
            return response.responseBody
        }
    }

Используемый клиент (world.example.Client) имеет следующий фрагмент кода:

public class Client {

@Autowired
private RestTemplate restTemplate;

public Response makeCall(Request request) {
    restTemplate.exchange(....)
}

}

При запуске кода. Я получаю следующее сообщение об ошибке:

NoSuchBeanDefinitionException: нет квалифицированного компонента типа 'org.springframework.web.client.RestTemplate': ожидается, что по крайней мере 1 компонент, который квалифицируется как кандидат для автоматической передачи. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true)}

  1. Где я должен объявить bean-компонент, когда конструктор имеет автопроводку?
  2. почему пружина не создает автоматически боб?

Мне нужна помощь в понимании проблемы, поэтому, пожалуйста, не просто публикуйте решение.

Ответы [ 2 ]

2 голосов
/ 26 января 2020

С помощью внедрения зависимостей Spring вы можете внедрить экземпляр компонента.

Весной это называется принцип инверсии управления (Io C). Io C также известен как внедрение зависимостей (DI).

Вы можете определить зависимости для вашего компонента с помощью переменной-члена или переменной-конструктора. Существуют различные возможности, например @Autowire в качестве аннотации для переменных-членов, таких как ваше использование.

Затем контейнер внедряет эти зависимости при создании вашего компонента.

Внимание , однако необходимо, чтобы контейнер пружины знал, как вводить зависимость. Есть много способов научить контейнер этому. Самый простой вариант - предоставить метод-производитель @Bean в классе @Configuration. Пружинный контейнер «сканирует» все @Configurations в начале контейнера и «регистрирует» производителя @Bean.

Никто еще не сделал производителя для RestTemplate. Не Spring self, а также никакой другой lib. Со многими другими bean-компонентами, которые вы используете, это уже сделано, а не с RestTemplate. Вы должны предоставить @Bean производителя для RestTemplate.

Сделайте это в новом @Configuration или в одном из ваших существующих @Configuration.

A @Configuration указывает, что класс объявляет один или несколько методов @Bean и может обрабатываться контейнером Spring для генерации определений bean-компонентов и запросов на обслуживание для этих bean-компонентов во время выполнения, например:

   @Configuration
   public class RestTemplateConfig {

         @Bean
         public RestTemplate restTemplate() {
             // New instance or more complex config 
             return new RestTemplate();
         }
     }
0 голосов
/ 26 января 2020

Определите RestTemplate как компонент в вашем классе конфигурации.

...