来自@Configuration 的自动装配 bean

Autowire bean from @Configuration

我是 Spring 的新手,我遇到了异常 "No qualifying bean of type [int] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}"。当我尝试以下方法时。

这是 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,而不是配置 class

@Autowired
private RestTemplate restTemplate;

而不是:

@Autowired
private RestClientConfig restTemplate;

编辑

这是将参数传递给 class 的一种方法:

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

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

@Autowired
private RestTemplate restTemplate;

这与您配置中的以下代码行有关

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 添加到 classpath

的根目录

您还可以将 @Value 注释与 属性 板夹一起使用以实现相同的效果

@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();
}

而且您还需要在配置中添加 属性 文件 class