Spring 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.
注釈駆動型環境でのSpring 4の使用。
私のディスパッチャサーブレットは次のように構成されています。
<context:component-scan base-package="in.myproject" />
<mvc:default-servlet-handler />
<mvc:annotation-driven />
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>
RestTemplateを自動配線しようとしている私のクラスは次のとおりです。
@Service("httpService")
public class HttpServiceImpl implements HttpService {
@Autowired
private RestTemplate restTemplate;
@Override
public void sendUserId(String userId){
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("userId", userId);
map.add("secretKey", "kbhyutu7576465duyfy");
restTemplate.postForObject("http://localhost:8081/api/user", map, null);
}
}
_RestTemplate
が定義されていない場合に表示されるエラー
構成で「org.springframework.web.client.RestTemplate」タイプのBeanを定義することを検討してください。
または
タイプ[org.springframework.web.client.RestTemplate]の修飾Beanが見つかりません
アノテーションを介してRestTemplate
を定義する方法
使用しているテクノロジーと、@Configuration
クラスでRestTemplate
を定義する方法に影響するバージョンに応じて異なります。
Spring> = 4 Spring Bootなし
@Bean
を定義するだけです:
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
Spring Boot <= 1.3
定義する必要はありません。SpringBootは自動的に定義します。
Spring Boot> = 1.4
Spring BootはRestTemplate
を自動的に定義しなくなりましたが、代わりにRestTemplateBuilder
を定義して、作成されるRestTemplate
をより詳細に制御できるようにします。 @Bean
メソッドの引数としてRestTemplateBuilder
を挿入して、RestTemplate
を作成できます。
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
// Do any additional configuration here
return builder.build();
}
クラスで使用する
@Autowired
private RestTemplate restTemplate;
または
@Inject
private RestTemplate restTemplate;
RestTemplateのデフォルト実装を提供するために、クラスに以下のメソッドを追加できます。
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
Spring Boot 1.4.0以降を注釈駆動型のベースとして使用している場合、Springは自動設定された単一のRestTemplate Beanを提供しません。ドキュメントから:
https://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/html/boot-features-restclient.html
アプリケーションからリモートRESTサービスを呼び出す必要がある場合は、Spring FrameworkのRestTemplateクラスを使用できます。 RestTemplateインスタンスは使用する前にカスタマイズする必要があることが多いため、Spring Bootは自動設定された単一のRestTemplate Beanを提供しません。ただし、必要なときにRestTemplateインスタンスを作成するために使用できるRestTemplateBuilderを自動構成します。自動構成のRestTemplateBuilderは、適切なHttpMessageConvertersがRestTemplateインスタンスに確実に適用されるようにします。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateClient {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@Autowired
private RestOperations restTemplate;
インターフェイスを実装にのみ自動配線できます。