[英]Autowire bean from @Configuration
我是Spring的新手,我遇到異常“找不到依賴項的類型為[int]的合格bean:期望至少有1個bean符合此依賴項的自動裝配候選。依賴注釋:{}”。 當我嘗試以下方法時。
這是RestTemplate的配置
@Configuration
public class RestClientConfig {
@Bean
public ObjectMapper getObjMapper(){
return new ObjectMapper();
}
@Bean
public RestTemplate createRestTemplate(int maxTotalConn, int maxPerChannel, int connTimout) {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(maxTotalConn);
connectionManager.setDefaultMaxPerRoute(maxPerChannel);
RequestConfig config = RequestConfig.custom().setConnectTimeout(connTimout).build();
CloseableHttpClient httpClient = HttpClientBuilder.create().setConnectionManager(connectionManager)
.setDefaultRequestConfig(config).build();
ClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate restTemplate = new RestTemplate(factory);
restTemplate.setErrorHandler(new RestResponseErrorHandler());
restTemplate.setMessageConverters(createMessageConverters());
return restTemplate;
}
private List<HttpMessageConverter<?>> createMessageConverters() {
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
jsonMessageConverter.setObjectMapper( getObjMapper());
messageConverters.add(jsonMessageConverter);
return messageConverters;
}
}
當我嘗試像這樣訪問時,會導致上述異常。
@Autowired
private RestClientConfig restTemplate;
ResponseEntity<String> response2 = restTemplate.createRestTemplate(100, 100, 100).exchange( url, HttpMethod.GET, entity , String.class );
請有人幫忙,為我指出正確的方法,我在做什么錯事?
您需要注入RestTemplate
,而不是config類
@Autowired
private RestTemplate restTemplate;
代替:
@Autowired
private RestClientConfig restTemplate;
編輯
這是將參數傳遞給類的一種方法:
//EXAMPLE @Value("${propFile.maxTotalConn}")
@Bean
public RestTemplate createRestTemplate(@Value("${propFile.maxTotalConn}") int maxTotalConn, @Value("${propFile.maxPerChannel}") int maxPerChannel, connTimoutint connTimout) {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(maxTotalConn);
connectionManager.setDefaultMaxPerRoute(maxPerChannel);
...
}
說明
創建一個屬性文件(*.properties)
並將其放置在src/main/resources
文件夾中。 如上面的代碼所示,在其中包含您的屬性。 @Value
是一個Spring
注釋,它在classpath
上搜索屬性文件,並在創建Spring bean時注入值。
這與配置中的以下代碼行有關
public RestTemplate createRestTemplate(int maxTotalConn, int maxPerChannel, int connTimout);
Spring希望在創建bean時三個整數參數可用。 價值應該從何而來。
您可以使用利用屬性文件(Spring屬性抽象)來注入3個字段
第一種選擇是在您的環境中提供參數,然后注入環境
public RestTemplate createRestTemplate(Environment env){
int maxTotalConn = env.getRequiredProperty("pool.maxSize" , Integer.class);
//lookup remaining parameters
}
然后確保您有一個屬性文件,例如包含設置的http-connection-pool.properties。 在配置文件上指定它
@Configuration
@PropertySource("classpath:http-connection-pool.properties")
public class RestClientConfig {
}
然后將http-connection-pool.properties添加到類路徑的根目錄
您還可以將@Value注釋與屬性placheolders結合使用以實現相同的效果
@Bean
public RestTemplate createRestTemplate(@Value("${pool.maxSize}")int maxTotalConn, @Value("${pool.maxPerChannel}")int maxPerChannel, @Value("${pool.connectionTimeout}")int connTimout) {
//more code
}
但是,使用這種方法時,您需要按如下所示注冊PropertySourcesPlaceholderConfigurer
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
而且您仍然需要在配置類上添加屬性文件
配置類用於告訴spring您想將哪些對象用作bean。 您已將RestTemplate類正確地標記為@Bean,因此可以輕松地通過應用程序將其自動裝配到其他類中。
@Autowired
private RestTemplate restTemplate;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.