如何为int-http:outbound-gateway的每个请求提供新的rest-template?

时间:2016-02-03 15:01:35

标签: spring-integration

当我传递一个在初始时保存基本凭据的rest-template时,我遇到了int-http:outbound-gateway的问题。但是,如果任何人更改了数据库中的凭据,则rest-template无法动态获取这些更新的凭据。

我的代码,

<int-http:outbound-gateway  id="OutboundGateway"
                                 request-channel="sendDataToContentType"
                                 url="http://localhost:8080"
                                 expected-response-type="java.lang.String"
                                 rest-template="restTemplate"/>

<bean id="httpComponentsMessageSender" class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
<property name="credentials">
    <bean class="org.apache.http.auth.UsernamePasswordCredentials">
        <constructor-arg value="${fromDatabase.userName}"/>
        <constructor-arg value="${fromDatabase.password}"/>
    </bean>
</property>

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg>
    <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
        <property name="httpClient" value="#{httpComponentsMessageSender.httpClient}"/>
    </bean>
</constructor-arg>

这有什么解决方案吗?

1 个答案:

答案 0 :(得分:0)

您不需要对rest-template做任何事情。实际上只需更新基础credentials上的HttpClient

我这样做与org.springframework.ws.transport.http.HttpComponentsMessageSender代码类似:

((org.apache.http.impl.client.DefaultHttpClient) getHttpClient())
                .getCredentialsProvider().setCredentials(authScope, credentials);

我的意思是,如果要更改数据库中的凭据,您应该检索服务中的#{httpComponentsMessageSender.httpClient}并调用该代码。

实际上,凭据用于每个请求:

context.setAttribute(
            ClientContext.CREDS_PROVIDER,
            getCredentialsProvider());
    return context;

使用AbstractHttpClient.doExecute()

因此,在一个地方更新HttpClient上的凭据会对<int-http:outbound-gateway>的下一个HTTP请求生效。

<强>更新

  

但是,在这种方法中,传递了一个新的httpClient实例

是的,您可以在初始化阶段使用HttpClientBuilder但只能使用一次。我的意思是你需要httpClient注入httpComponentsMessageSender

原因是你可以通过那里(HttpClientBuilder)传递自己的CredentialsProvider。当您的数据库服务可以使用相同的setCredentials(authScope, credentials)时。