2016-10-13 2 views
-1

Я новичок в Spring, я получаю исключение «Отсутствие квалификационного компонента типа [int], найденного для зависимости: ожидается по крайней мере 1 компонент, который квалифицируется как кандидат на автоподключение для этой зависимости. Аннотации зависимостей: { }». Когда я попробую подход ниже.Autowire bean from @Configuration

Это конфигурация для 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); 

Пожалуйста, помогите и укажите мне правильный подход и что я делаю что-то неправильно?

ответ

4

Вам нужно впрыскивать RestTemplate, а не класс конфигурации

@Autowired 
private RestTemplate restTemplate; 

вместо:

@Autowired 
private RestClientConfig restTemplate; 

EDIT

Вот один из способов передать ваши аргументы в классе :

//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.

+0

, пожалуйста, вы можете сообщить мне, как я могу вызвать и передать Аргументы для createRestTemplate (int maxTotalConn, int maxPerChannel, int connTimout) – Umar

+0

@Umar проверить мой пост, как я сделал рекомендацию. Надеюсь, поможет! – Mechkov

+0

Я пытался использовать этот метод createRestTemplate для нескольких сервисов, поэтому каждая служба может передавать свою собственную конфигурацию max Connection, timeout. Можно ли так добиться? – Umar

0

Конфигурационные классы используются, чтобы рассказать весне, какие объекты вы хотите использовать в качестве бобов. Вы правильно пометили класс RestTemplate как @Bean, так что вы можете легко автоупроверить его в другие классы через приложение.

@Autowired 
private RestTemplate restTemplate; 
1

Это сделать с помощью следующей строки кода в конфигурации

public RestTemplate createRestTemplate(int maxTotalConn, int maxPerChannel, int connTimout); 

Spring ожидает три целочисленные параметры будут доступны, когда он создает боб. Откуда берутся значения.

Вы можете использовать использовать файлы свойства (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.свойства в корень вашего пути к классам

Вы также можете использовать @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(); 
} 

И вам еще нужно добавить файлы свойств в свой класс конфигурации

Смежные вопросы