J'obtiens une exception ci-dessous lors de l'exécution de l'application Spring Boot au 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'utilise RestTemplate automatiquement 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(String[] 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 String 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.toString());
return "false";
}
}
POM.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.micro.test</groupId>
<artifactId>Test-MicroService</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Test-MicroService</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
RestTemplate
n'est pas automatiquement créé pour vous.Réponses:
C'est exactement ce que dit l'erreur. Vous n'avez créé aucun
RestTemplate
bean, il ne peut donc pas en passer automatiquement. Si vous en avez besoin,RestTemplate
vous devrez en fournir un. Par exemple, ajoutez ce qui suit à TestMicroServiceApplication.java :Notez que dans les versions antérieures du Spring cloud starter pour Eureka, un
RestTemplate
bean a été créé pour vous, mais ce n'est plus le cas.la source
RestTemplate
moment où tout le reste est créé et lié par magie pour vous. Surtout si on utilisait avant le spring-cloud qui fournit un autoconfiguréRestTemplate
. ;-)RestTemplateBuilder
peut être utilisé pour gérer lesRestTemplate
instances. Exemple ici spring.io/guides/gs/consuming-restspring-cloud-netflix
artifactid avec la version1.1.5.RELEASE
. Mon RestTemplate est appelé à partir d'une@RestController
classe java qui utilise@Autowired
pour leRestTemplate
. Puis-je avoir une aide s'il vous plait ?En fonction des technologies que vous utilisez et des versions qui influenceront la façon dont vous définissez un
RestTemplate
dans votre@Configuration
classe.Spring> = 4 sans Spring Boot
Définissez simplement un
@Bean
:Botte à ressort <= 1,3
Pas besoin d'en définir un, Spring Boot en définit automatiquement un pour vous.
Botte à ressort> = 1,4
Spring Boot ne définit plus automatiquement un
RestTemplate
mais définit plutôt unRestTemplateBuilder
vous permettant plus de contrôle sur le RestTemplate qui est créé. Vous pouvez injecter leRestTemplateBuilder
comme argument dans votre@Bean
méthode pour créer unRestTemplate
:L'utiliser dans votre classe
Référence
la source
Si un 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
puis
@Autowired
fonctionnera. Si vous utilisezpuis créez un TestRestTemplate comme celui-ci
la source
L'erreur indique directement que le
RestTemplate
bean 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 le RestTemplate, utilisez ce qui suit pour imprimer les beans disponibles dans le contexte chargé par l'application Spring Boot
Si cela contient le bean du nom / type donné, tout va bien. Ou bien définissez un nouveau bean puis utilisez-le.
la source
RestTemplateBuilder offre un moyen approprié de configurer et d'instancier le bean de modèle rest, par exemple pour l'authentification de base ou les intercepteurs.
la source
@Bean public RestTemplate restTemplate(RestTemplateBuilder builder){ return builder.build(); }
la source
Veuillez vous assurer de deux choses:
1- Utilisez l'
@Bean
annotation avec la méthode.2- La portée de cette méthode doit être publique et non privée .
Exemple complet -
la source
La façon la plus simple que j'ai pu réaliser un exploit similaire d'utiliser le code ci-dessous ( référence ), mais je suggérerais de ne pas faire d'appels API dans les contrôleurs ( principes SOLID ). Le câblage automatique de cette manière est également mieux optimisé que la manière traditionnelle de le faire.
la source
vous essayez d'injecter le restTemplate mais vous devez créer une classe de configuration. là, vous devez créer un bean qui vous renvoie un nouveau RestTemplate, voir l'exemple ci-dessous.
la source