我有一个Java类,如下所示,该类创建具有连接和读取超时的rest模板,还创建一个重试模板,该模板在发生连接和读取超时时执行重试。我正在从application.properties文件中读取值,但是由于某些原因,正在读取的值会得到空值。我不知道该如何解决。任何对此的建议将不胜感激。
public class Retry {
@Value("${read.Timeout.InMilliSeconds:-1}")
private Integer readTimeoutInMilliSeconds;
@Value("${connect.Timeout.InMilliSeconds:-1}")
private Integer connectTimeoutInMilliSeconds;
@Value("${backOff.Period.InMilliSeconds:-1}")
private Integer backOffPeriodInMilliSeconds;
@Value("${max.Attempts:-1}")
private Integer maxAttempts;
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
return restTemplate;
}
private HttpComponentsClientHttpRequestFactory getClientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setReadTimeout(readTimeoutInMilliSeconds);
requestFactory.setConnectTimeout(connectTimeoutInMilliSeconds);
return requestFactory;
}
@Bean
public RetryTemplate retryTemplate() {
Map<Class<? extends Throwable>, Boolean> retryableExpressions = new HashMap<>();
// connection and read timeouts
retryableExpressions.put(ResourceAccessException.class, true);
// 404
retryableExpressions.put(RestClientException.class, false);
SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(maxAttempts, retryableExpressions);
FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
backOffPolicy.setBackOffPeriod(backOffPeriodInMilliSeconds);
RetryTemplate retryTemplate = new RetryTemplate();
retryTemplate.setRetryPolicy(simpleRetryPolicy);
retryTemplate.setBackOffPolicy(backOffPolicy);
return retryTemplate;
}
@Bean
public RetryRestTemplate retryRestTemplate() {
return new RetryRestTemplate(
restTemplate(),
retryTemplate());
}
}
application.properties
read.Timeout.InMilliSeconds=10000
connect.Timeout.InMilliSeconds=10000
backOff.PeriodInMilliSeconds=10000
max.Attempts=5
堆栈跟踪
Caused by: java.lang.NullPointerException: null
at com.beans.Retry.getClientHttpRequestFactory(Retry.java:43)
at com.beans.Retry.restTemplate(Retry.java:36)
at com.beans.Services.retryRestTemplate(Services.java:82)
at com.beans.Services$$EnhancerBySpringCGLIB$$819e8a9c.CGLIB$retryRestTemplate$3(<generated>)
at com.beans.Services$$EnhancerBySpringCGLIB$$819e8a9c$$FastClassBySpringCGLIB$$65931da6.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)
at com.beans.Services$$EnhancerBySpringCGLIB$$819e8a9c.retryRestTemplate(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
... 213 common frames omitted
以退出代码1完成的过程
RetryRestTemplate
public class RetryRestTemplate {
private RestTemplate restTemplate;
private RetryTemplate retryTemplate;
public RetryRestTemplate(RestTemplate restTemplate, RetryTemplate retryTemplate) {
this.restTemplate = this.restTemplate;
this.retryTemplate = this.retryTemplate;
}
public ResponseEntity getForEntity(URI uri, Class c) {
return retryTemplate.execute(retryContext -> {
System.out.println("Check");
return restTemplate.getForEntity(uri, c);
});
}
public ResponseEntity exchange(String url, HttpMethod get, HttpEntity headers, Class c) {
return retryTemplate.execute(retryContext -> {
return restTemplate.exchange(url, get, headers, c);
});
}
public <T extends Object> ResponseEntity<T> postForEntity(String apiUrl, HttpEntity<Object> entityRequest, Class<T> responseClass) {
return retryTemplate.execute(retryContext -> {
return restTemplate.postForEntity(apiUrl, entityRequest, responseClass);
});
}
}
@Value(...)
移至相应的方法中作为输入参数,如下所示:private HttpComponentsClientHttpRequestFactory getClientHttpRequestFactory(
@Value("${read.Timeout.InMilliSeconds:-1}") Integer readTimeoutInMilliSeconds,
@Value("${connect.Timeout.InMilliSeconds:-1}") Integer connectTimeoutInMilliSeconds) {
...
}
@Bean
public RetryTemplate retryTemplate(
@Value("${backOff.Period.InMilliSeconds:-1}") Integer backOffPeriodInMilliSeconds,
@Value("${max.Attempts:-1}") Integer maxAttempts) {
...
}