How to - Spring IoC and HttpClient 4.3.1 CloseableHttpClient?

nsayer picture nsayer · Dec 3, 2013 · Viewed 25.5k times · Source

I'd like to have Spring IoC configure a CloseableHttpClient object and inject it into my class so that customization of its configuration can be done via XML.

From what I can see, HttpClient seems to resist this pattern quite forcibly. They want you to do things like

CloseableHttpClient chc =
    HttpClients.custom().set<thing that should be a property>().build();

Ick.

Is there not some mechanism for making a singleton CloseableHttpClient bean that I can then use?

Answer

Matt picture Matt · Feb 12, 2014

This seems to work for me:

<bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig"
    factory-method="custom">
    <property name="socketTimeout" value="${socketTimeoutInMillis}" /> 
    <property name="connectTimeout" value="${connectionTimeoutInMillis}" /> 
</bean>

<bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />

<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder"
    factory-method="create">
    <property name="defaultRequestConfig" ref="requestConfig" />
</bean>

<bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build" />

That gives me a CloseableHttpClient in the "httpClient" bean, with the socket and connection timeouts configured. You should be able to add more properties to either the requestConfigBuilder or the httpClientBuilder.