Beim Ausführen der Spring Boot-Anwendung während des Startvorgangs wird die folgende Ausnahme angezeigt:
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)}
Ich verdrahtete RestTemplate automatisch in meinem TestController. Ich verwende Maven für das Abhängigkeitsmanagement.
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>
spring
maven
spring-boot
resttemplate
Khuzi
quelle
quelle
RestTemplate
ist, nicht automatisch ein für Sie erstellt wird.Antworten:
Genau das sagt der Fehler. Sie haben keine
RestTemplate
Bean erstellt, daher kann sie keine automatisch verdrahten. Wenn Sie eine benötigen, müssenRestTemplate
Sie eine bereitstellen. Fügen Sie beispielsweise TestMicroServiceApplication.java Folgendes hinzu :Beachten Sie, dass in früheren Versionen des Spring Cloud Starters für Eureka eine
RestTemplate
Bean für Sie erstellt wurde. Dies ist jedoch nicht mehr der Fall.quelle
RestTemplate
wenn alles andere auf magische Weise für Sie erstellt und verknüpft wurde. Vor allem, wenn man eine Frühlingswolke verwendet, vor der eine automatisch konfigurierte bereitgestellt wirdRestTemplate
. ;-)RestTemplateBuilder
kann 1.4.0 zum Verwalten vonRestTemplate
Instanzen verwendet werden. Beispiel hier spring.io/guides/gs/consuming-restspring-cloud-netflix
Artefaktid mit Version1.1.5.RELEASE
. Mein RestTemplate wird von einer@RestController
Java-Klasse aufgerufen, die@Autowired
für das verwendetRestTemplate
. Kann mir bitte jemand helfen?Abhängig davon, welche Technologien Sie verwenden und welche Versionen Einfluss darauf haben, wie Sie eine
RestTemplate
in Ihrer@Configuration
Klasse definieren.Feder> = 4 ohne Spring Boot
Definieren Sie einfach
@Bean
:Spring Boot <= 1.3
Sie müssen keine definieren, Spring Boot definiert automatisch eine für Sie.
Spring Boot> = 1.4
Spring Boot definiert nicht mehr automatisch eine,
RestTemplate
sondern eineRestTemplateBuilder
, mit der Sie mehr Kontrolle über die erstellte RestTemplate haben. Sie können dasRestTemplateBuilder
als Argument in Ihre@Bean
Methode einfügen, um Folgendes zu erstellenRestTemplate
:Verwenden Sie es in Ihrer Klasse
Referenz
quelle
Wenn eine TestRestTemplate eine gültige Option in Ihrem Komponententest ist, ist diese Dokumentation möglicherweise relevant
http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#boot-features-rest-templates-test-utility
Kurze Antwort: wenn mit
dann
@Autowired
wird es funktionieren. Bei VerwendungErstellen Sie dann eine TestRestTemplate wie folgt
quelle
Der Fehler weist direkt darauf hin, dass die
RestTemplate
Bean nicht im Kontext definiert ist und die Beans nicht laden kann.Wenn Sie sicher sind, dass die Bean für die RestTemplate definiert ist, verwenden Sie Folgendes, um die Beans zu drucken, die in dem von der Spring Boot-Anwendung geladenen Kontext verfügbar sind
Wenn dies die Bohne mit dem angegebenen Namen / Typ enthält, dann ist alles gut. Oder definieren Sie eine neue Bohne und verwenden Sie sie dann.
quelle
RestTemplateBuilder bietet die richtige Möglichkeit, die Rest Template Bean zu konfigurieren und zu instanziieren, z. B. für grundlegende Authentifizierungs- oder Interceptors.
quelle
@Bean public RestTemplate restTemplate(RestTemplateBuilder builder){ return builder.build(); }
quelle
Bitte stellen Sie zwei Dinge sicher:
1- Verwenden Sie
@Bean
Annotation mit der Methode.2- Der Umfang dieser Methode sollte öffentlich und nicht privat sein .
Vollständiges Beispiel -
quelle
Auf einfachste Weise konnte ich eine ähnliche Leistung erzielen, indem ich den folgenden Code verwendete ( Referenz ), aber ich würde vorschlagen, keine API-Aufrufe in Controllern durchzuführen ( SOLID-Prinzipien ). Auch das automatische Verdrahten auf diese Weise ist besser optimiert als die herkömmliche Vorgehensweise.
quelle
Sie versuchen, die restTemplate einzufügen, müssen jedoch eine Konfigurationsklasse erstellen. Dann müssen Sie dort eine Bean erstellen, die Ihnen neues RestTemplate zurückgibt (siehe das folgende Beispiel).
quelle