当我传递一个在初始时保存基本凭据的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>
这有什么解决方案吗?
答案 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)
时。