Lorsque j'essaie d'autowire Spring RestTemplate, le message d'erreur suivant s'affiche:
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.
Utilisation de Spring 4 dans un environnement piloté par des annotations.
Mon servlet de distributeur est configuré comme suit:
<context:component-scan base-package="in.myproject" />
<mvc:default-servlet-handler />
<mvc:annotation-driven />
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>
Ma classe dans laquelle j'essaie d'autowire RestTemplate est la suivante:
@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);
}
}
Les erreurs que vous verrez si un RestTemplate
n'est pas défini
Pensez à définir un bean de type 'org.springframework.web.client.RestTemplate' dans votre configuration.
ou
Aucun bean qualifiant de type [org.springframework.web.client.RestTemplate] trouvé
Comment définir un RestTemplate
via des annotations
Selon les technologies que vous utilisez et les versions qui influenceront la façon dont vous définissez un RestTemplate
dans votre @Configuration
classe.
Printemps> = 4 sans démarrage à ressort
Définissez simplement un @Bean
:
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
Spring Boot <= 1.3
Nul besoin d'en définir un, Spring Boot en définit automatiquement un pour vous.
Spring Boot> = 1.4
Spring Boot ne définit plus automatiquement un RestTemplate
, mais définit un RestTemplateBuilder
, ce qui vous permet de mieux contrôler le RestTemplate
créé. Vous pouvez injecter le RestTemplateBuilder
comme argument dans votre @Bean
méthode pour créer un RestTemplate
:
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
// Do any additional configuration here
return builder.build();
}
L'utiliser dans votre classe
@Autowired
private RestTemplate restTemplate;
ou
@Inject
private RestTemplate restTemplate;
Vous pouvez ajouter la méthode ci-dessous à votre classe pour fournir une implémentation par défaut de RestTemplate:
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
Si vous utilisez Spring Boot 1.4.0 ou une version ultérieure comme base de votre gestion par annotation, Spring ne fournit pas un seul bean RestTemplate auto-configuré. De leur documentation:
https://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/html/boot-features-restclient.html
Si vous devez appeler des services distants REST à partir de votre application, vous pouvez utiliser la classe RestTemplate de Spring Framework. Étant donné que les instances RestTemplate doivent souvent être personnalisées avant d'être utilisées, Spring Boot ne fournit aucune procédure automatique. Le bean RestTemplate configuré configure automatiquement un RestTemplateBuilder qui peut être utilisé pour créer des instances RestTemplate en cas de besoin.Le RestTemplateBuilder auto-configuré garantit que les HttpMessageConverters sensibles sont appliqués aux instances RestTemplate.
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();
}
}
@Autowired
private RestOperations restTemplate;
Vous pouvez uniquement utiliser des interfaces autowire avec des implémentations.