从@Configuration自动装配bean

时间:2016-10-13 14:19:46

标签: java spring autowired resttemplate

我是Spring的新手,我得到了异常“没有为依赖项找到类型[int]的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者。依赖注释:{}”。当我尝试以下方法时。

这是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 );

请帮助一些人并指出正确的做法和我做错什么?

3 个答案:

答案 0 :(得分:4)

您需要注入RestTemplate,而不是注入配置类

@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时注入值。

答案 1 :(得分:1)

这与配置中的以下代码行

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

Spring期望在创建bean时可以使用这三个整数参数。这些价值应该来自哪里。

您可以使用属性文件的make use(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();
}

您仍然需要在配置类

上添加属性文件

答案 2 :(得分:0)

配置类用于告诉spring要将哪些对象用作bean。您已将RestTemplate类正确标记为@Bean,因此您可以通过应用程序轻松地将其自动装配到其他类中。

@Autowired
private RestTemplate restTemplate;