Je suis en dessous de l’exception lors de l’exécution de l’application Spring Boot lors du démarrage:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.web.client.RestTemplate com.micro.test.controller.TestController.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. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
J’envoie automatiquement RestTemplate dans mon TestController. J’utilise Maven pour la gestion des dépendances.
TestMicroServiceApplication.java
package com.micro.test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class TestMicroServiceApplication { public static void main(Ssortingng[] args) { SpringApplication.run(TestMicroServiceApplication.class, args); } }
TestController.java
package com.micro.test.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class TestController { @Autowired private RestTemplate restTemplate; @RequestMapping(value="/micro/order/{id}", method=RequestMethod.GET, produces=MediaType.ALL_VALUE) public Ssortingng placeOrder(@PathVariable("id") int customerId){ System.out.println("Hit ===> PlaceOrder"); Object[] customerJson = restTemplate.getForObject("http://localhost:8080/micro/customers", Object[].class); System.out.println(customerJson.toSsortingng()); return "false"; } }
POM.xml
4.0.0 com.micro.test Test-MicroService 0.0.1-SNAPSHOT jar Test-MicroService Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 1.3.3.RELEASE UTF-8 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
C’est exactement ce que dit l’erreur. Vous n’avez créé aucun bean RestTemplate
, il ne peut donc en générer aucun. Si vous avez besoin d’un RestTemplate
vous devrez en fournir un. Par exemple, ajoutez les éléments suivants à TestMicroServiceApplication.java :
@Bean public RestTemplate restTemplate() { return new RestTemplate(); }
Notez que dans les versions antérieures de Spring Cloud Starter pour Eureka, un bean RestTemplate
été créé pour vous, mais ce n’est plus le cas.
Si TestRestTemplate est une option valide dans votre test unitaire, cette documentation peut être pertinente
Réponse courte: si vous utilisez
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
alors @Autowired
fonctionnera. Si vous utilisez
@SpringBootTest(webEnvironment=WebEnvironment.MOCK)
puis créez un TestRestTemplate comme ceci
private TestRestTemplate template = new TestRestTemplate();
Selon les technologies que vous utilisez et quelles versions influenceront la façon dont vous définissez un RestTemplate
dans votre classe @Configuration
.
Printemps> = 4 sans botte de spring
Définissez simplement un @Bean
:
@Bean public RestTemplate restTemplate() { return new RestTemplate(); }
Spring Boot <= 1.3
Pas 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 plutôt un RestTemplateBuilder
vous permettant de mieux contrôler le RestTemplate créé. Vous pouvez injecter le RestTemplateBuilder
en tant qu’argument dans votre méthode @Bean
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;
Référence
Les points d’erreur directement que le bean RestTemplate
n’est pas défini dans le contexte et qu’il ne peut pas charger les beans.
Si vous êtes sûr que le bean est défini pour RestTemplate, utilisez ce qui suit pour imprimer les beans disponibles dans le contexte chargé par l’application Spring Boot
ApplicationContext ctx = SpringApplication.run(Application.class, args); Ssortingng[] beanNames = ctx.getBeanDefinitionNames(); Arrays.sort(beanNames); for (Ssortingng beanName : beanNames) { System.out.println(beanName); }
Si cela contient le bean par le nom / type donné, alors tout va bien. Ou bien définissez un nouveau haricot, puis utilisez-le.
Comme les instances RestTemplate doivent souvent être personnalisées avant d’être utilisées, Spring Boot ne fournit aucun bean RestTemplate configuré automatiquement.
RestTemplateBuilder offre une méthode appropriée pour configurer et instancier le bean de modèle de rest, par exemple pour l’authentification de base ou les intercepteurs.
@Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder .basicAuthorization("user", "name") // Optional Basic auth example .interceptors(new MyCustomInterceptor()) // Optional Custom interceptors, etc.. .build(); }