请提供以下bean定义
@Bean
public RestTemplate produceRestTemplate(ClientHttpRequestFactory requestFactory){
RestTemplate restTemplate = new RestTemplate(requestFactory);
restTemplate.setErrorHandler(restTemplateErrorHandler);
return restTemplate;
}
@Bean
public ClientHttpRequestFactory createRequestFactory() {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(maxTotalConn);
connectionManager.setDefaultMaxPerRoute(maxPerChannel);
RequestConfig config = RequestConfig.custom().setConnectTimeout(100000).build();
CloseableHttpClient httpClient = HttpClients.createDefault();
return new HttpComponentsClientHttpRequestFactory(httpClient);
}
代码运行良好,但问题是fortify将上面的代码标记为以下代码可能有问题
“有时函数createRequestFactory() 无法释放第141行上由createDefault()分配的套接字。”
请任何有任何想法的人如何正确地做到这一点,而不必强加警报
预先感谢
答案 0 :(得分:1)
我很确定您不需要做任何事情。似乎无法解决此使用情况,这是一个有力的问题。使用代码分析器时,有一种机制可以排除异常-这些工具并不总是正确的。
一些讨论
想象一下,您在没有CloseableHttpClient
或@Bean
的情况下使用HttpComponentsClientHttpRequestFactory
,那么我会说强化是正确的,因为那是使用java.io.Closeable
。
Spring bean通常是单例的,目的是要重用实例,因此,强化应该知道您没有创建多个实例,并且在关闭工厂时销毁了AutoCloseable上的close()
方法。
如果您查看--org.springframework.http.client.HttpComponentsClientHttpRequestFactory
的代码,就在这里。
/**
* Shutdown hook that closes the underlying
* {@link org.apache.http.conn.HttpClientConnectionManager ClientConnectionManager}'s
* connection pool, if any.
*/
@Override
public void destroy() throws Exception {
if (this.httpClient instanceof Closeable) {
((Closeable) this.httpClient).close();
}
}
您的要害是孤立地查看代码,而不是以集成的方式查看代码,因此标记是。
答案 1 :(得分:0)
检查这2点,以解决问题。
httpClient.close()
方法,那么有时您可以有效地
用完套接字。如果您的代码是在某个地方自动调用此方法,则不会有任何问题。
无论如何,根据您使用的Java和Lib的版本,这可能是FalsePositiv