簡體   English   中英

來自@Configuration的Autowire bean

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM