如何解决Spring Boot-@Value在@Component类中返回null
@Slf4j
@Component
public class RestTemplateResponseErrorHandler
implements ResponseErrorHandler {
@Value("${invalid.password:test}")
private String invalidPassword;
@Override
public boolean hasError(ClientHttpResponse httpResponse)
throws IOException {
return (
httpResponse.getStatusCode().series() == CLIENT_ERROR
|| httpResponse.getStatusCode().series() == SERVER_ERROR);
}
@Override
public void handleError(ClientHttpResponse httpResponse)
throws IOException {
if (httpResponse.getStatusCode()
.series() == SERVER_ERROR) {
log.info("RestTemplateResponseErrorHandler --- SERVER_ERROR");
// handle SERVER_ERROR
} else if (httpResponse.getStatusCode()
.series() == CLIENT_ERROR) {
log.info("RestTemplateResponseErrorHandler --- CLIENT_ERROR");
if (httpResponse.getStatusCode() == HttpStatus.BAD_REQUEST)
throw new UnAuthorisedRequestException(invalidPassword);
}
}
}
在这里抛出新的UnAuthorisedRequestException(invalidPassword);返回null
不确定类是什么问题,因为它被标记为@Component
@Configuration
public class CommonBeanConfig {
@Bean
public RestTemplate restTemplate(SSLSocketFactory sslSocketFactory) {
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(new SSLConnectionSocketFactory(sslSocketFactory,new NoopHostnameVerifier()))
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(requestFactory));
restTemplate.setInterceptors(Collections.singletonList(new ClientLoggingInterceptor()));
restTemplate.setErrorHandler(new RestTemplateResponseErrorHandler());
return restTemplate;
}
}
该类被添加为异常处理程序
解决方法
String
不是由spring管理的-您可以“手动”创建它。因此spring不能将RestTemplateResponseErrorHandler
用于它无法管理的对象。
尝试以下操作:
@Value
注意,由于您已经在使用java config-不必放置@Component
在@Configuration
public class CommonBeanConfig {
@Bean
public RestTemplateResponseErrorHandler restTemplateErrorHandler() {
return new RestTemplateErrorHandler();
}
@Bean
public RestTemplate restTemplate(SSLSocketFactory sslSocketFactory) {
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(new SSLConnectionSocketFactory(sslSocketFactory,new NoopHostnameVerifier()))
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(requestFactory));
restTemplate.setInterceptors(Collections.singletonList(new ClientLoggingInterceptor()));
restTemplate.setErrorHandler(restTemplateErrorHandler()); // or inject the parameter into the method public RestTemplate restTemplate(SSLSocketFactory sslSocketFactory,RestTemplateErrorHandler restTemplateErrorHandler)
return restTemplate;
}
}
类上。
如果您确实必须使用RestTemplateErrorHandler
并希望通过组件扫描来发现和实例化它-请勿在Java配置中为错误处理程序创建Bean并使用我在注释中提到的方法@Component
:
restTemplate
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。