Как автоустановить RestTemplate с помощью аннотаций

Когда я пытаюсь autwire Spring RestTemplate, я получаю следующую ошибку:

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.web.client.RestTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.

Использование Spring 4 в среде, зависящей от аннотаций.

Мой сервлет диспетчера настроен следующим образом:

<context:component-scan base-package="in.myproject" />
<mvc:default-servlet-handler />    
<mvc:annotation-driven />
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>

Мой класс, в котором я пытаюсь autwire RestTemplate, выглядит следующим образом:

@Service("httpService")
public class HttpServiceImpl implements HttpService {

@Autowired
private RestTemplate restTemplate;

@Override
public void sendUserId(String userId){

    MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
    map.add("userId", userId);
    map.add("secretKey", "kbhyutu7576465duyfy");

    restTemplate.postForObject("http://localhost:8081/api/user", map, null);


    }
}

Ответы

Ответ 1

Ошибки, которые вы увидите, если RestTemplate не определен

Рассмотрим определение типа bean типа 'org.springframework.web.client.RestTemplate' в вашей конфигурации.

или

Нет квалификационного bean типа [org.springframework.web.client.RestTemplate] найдено

Как определить RestTemplate через аннотации

В зависимости от того, какие технологии вы используете и какие версии повлияют на то, как вы определяете RestTemplate в своем классе @Configuration.

Spring >= 4 без Spring Загрузка

Просто определите @Bean:

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

Spring Boot <= 1.3

Не нужно определять один, Spring Boot автоматически определяет его для вас.

Spring Загрузкa >= 1.4

Spring Boot больше не определяет автоматически RestTemplate, но вместо этого определяет RestTemplateBuilder, позволяя вам больше управлять созданным RestTemplate. Вы можете ввести RestTemplateBuilder в качестве аргумента в свой метод @Bean для создания RestTemplate:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
   // Do any additional configuration here
   return builder.build();
}

Используя его в своем классе

@Autowired
private RestTemplate restTemplate;

или

@Inject
private RestTemplate restTemplate;

Ответ 2

Вы можете добавить метод ниже к вашему классу для обеспечения реализации RestTemplate по умолчанию:

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

Ответ 3

Если вы используете Spring Boot 1.4.0 или более позднюю версию в качестве основы для вашего аннотационного управления, Spring не предоставляет один автоматически сконфигурированный RestTemplate bean. Из их документации:

https://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/html/boot-features-restclient.html

Если вам нужно вызвать удаленные службы REST из вашего приложения, вы можете использовать класс Spring Frameworks RestTemplate. Поскольку экземпляры RestTemplate часто должны быть настроены перед использованием, Spring Boot не предоставляет ни одного автоматически настроенного RestTemplate bean. Однако он автоматически настраивает RestTemplateBuilder, который может быть использован для создания экземпляров RestTemplate при необходимости. Автоматически сконфигурированный RestTemplateBuilder гарантирует, что разумные HttpMessageConverters будут применены к экземплярам RestTemplate.

Ответ 4

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateClient {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

Ответ 5

@Autowired
private RestOperations restTemplate;

Вы можете только autwire интерфейсы с реализациями.

Ответ 6

Добавьте аннотацию @Configuration в RestTemplateSOMENAME, которая расширяет класс RestTemplate.

@Configuration         
public class RestTemplateClass extends RestTemplate {

}

Затем в классе вашего контроллера вы можете использовать аннотацию Autowired следующим образом.

@Autowired   
RestTemplateClass restTemplate;