Saya mendapatkan pengecualian di bawah ini saat menjalankan aplikasi boot musim semi selama start up:
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)}
Saya memasang RestTemplate secara otomatis di TestController saya. Saya menggunakan Maven untuk manajemen ketergantungan.
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
sumber
sumber
RestTemplate
tidak secara otomatis dibuat untuk Anda.Jawaban:
Persis seperti itulah yang dikatakan kesalahan. Anda tidak membuat
RestTemplate
kacang apa pun , jadi tidak bisa membuat autowire apa pun. Jika Anda membutuhkan,RestTemplate
Anda harus menyediakannya. Misalnya, tambahkan yang berikut ini ke TestMicroServiceApplication.java :Perhatikan, di versi awal Spring cloud starter untuk Eureka,
RestTemplate
kacang telah dibuat untuk Anda, tetapi ini tidak berlaku lagi.sumber
RestTemplate
ketika segala sesuatu yang lain secara ajaib dibuat dan ditautkan untuk Anda. Terutama jika seseorang menggunakan spring-cloud sebelumnya yang menyediakan konfigurasi otomatisRestTemplate
. ;-)RestTemplateBuilder
dapat digunakan untuk mengelolaRestTemplate
instans. Contoh di sini spring.io/guides/gs/consuming-restspring-cloud-netflix
artefak dengan versi1.1.5.RELEASE
. RestTemplate saya dipanggil dari@RestController
kelas java yang digunakan@Autowired
untukRestTemplate
. Dapatkah seseorang tolong bantu ?Bergantung pada teknologi apa yang Anda gunakan dan versi apa yang akan memengaruhi cara Anda mendefinisikan a
RestTemplate
di@Configuration
kelas Anda .Spring> = 4 tanpa Spring Boot
Cukup tentukan
@Bean
:Sepatu Musim Semi <= 1.3
Tidak perlu menentukannya, Spring Boot otomatis menentukannya untuk Anda.
Sepatu Musim Semi> = 1.4
Spring Boot tidak lagi secara otomatis mendefinisikan a
RestTemplate
melainkan mendefinisikanRestTemplateBuilder
memungkinkan Anda lebih mengontrol RestTemplate yang dibuat. Anda dapat memasukkanRestTemplateBuilder
sebagai argumen dalam@Bean
metode Anda untuk membuatRestTemplate
:Menggunakannya di kelas Anda
Referensi
sumber
Jika TestRestTemplate adalah opsi yang valid dalam pengujian unit Anda, dokumentasi ini mungkin relevan
http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#boot-features-rest-templates-test-utility
Jawaban singkatnya: jika menggunakan
maka
@Autowired
akan berhasil. Jika menggunakankemudian buat TestRestTemplate seperti ini
sumber
Kesalahan menunjukkan secara langsung bahwa
RestTemplate
kacang tidak didefinisikan dalam konteks dan tidak dapat memuat kacang.Jika Anda yakin bahwa kacang ditentukan untuk RestTemplate kemudian gunakan yang berikut ini untuk mencetak kacang yang tersedia dalam konteks yang dimuat oleh aplikasi boot musim semi
Jika ini berisi kacang dengan nama / jenis yang diberikan, maka semuanya bagus. Atau definisikan kacang baru dan kemudian gunakan.
sumber
RestTemplateBuilder menawarkan cara yang tepat untuk mengkonfigurasi dan membuat instance kacang template lainnya, misalnya untuk autentikasi dasar atau interseptor.
sumber
@Bean public RestTemplate restTemplate(RestTemplateBuilder builder){ return builder.build(); }
sumber
Harap pastikan dua hal:
1- Gunakan
@Bean
anotasi dengan metode.2- Cakupan metode ini harus publik, bukan privat .
Contoh Lengkap -
sumber
Cara paling sederhana saya dapat mencapai prestasi serupa dengan menggunakan kode di bawah ini ( referensi ), tetapi saya menyarankan untuk tidak membuat panggilan API dalam pengontrol ( prinsip SOLID ). Juga autowiring dengan cara ini lebih dioptimalkan daripada cara tradisional melakukannya.
sumber
Anda mencoba memasukkan restTemplate tetapi Anda perlu membuat kelas konfigurasi. maka di sana Anda perlu membuat kacang yang mengembalikan Anda RestTemplate baru lihat contoh di bawah ini.
sumber