来自@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
我是 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