Impossible de générer automatiquement le champ: RestTemplate dans l’application d’amorçage Spring

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

http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#boot-features-rest-templates-test-utility

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.

  1. Définir un bean pour RestTemplate, puis l’utiliser
  2. Utiliser une nouvelle instance de RestTemplate

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(); }