我是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 );
请帮助一些人并指出正确的做法和我做错什么?
答案 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;