У меня есть два веб-сервиса с разными учетными данными авторизации. Я пытаюсь создать общую базу WebServiceGatewaySupport
для этих служб, чтобы я мог делиться перехватчиками и маршалинговой логикой c для этих служб.
В настоящее время мой код выглядит следующим образом.
@Component
public class GenericWSTemplate<I, O> extends WebServiceGatewaySupport implements WebServiceMessageCallback {
@Override
public void initGateway() throws Exception {
// ...
MessageFactory messageFactory = new com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl();
SaajSoapMessageFactory saajSoapMessageFactory = new SaajSoapMessageFactory(messageFactory);
// ...
}
public Object callWebService(String url, WebServiceMessageCallback requestCallback) {
return getWebServiceTemplate().sendAndReceive(url, requestCallback);
}
}
@Component
public class GetResourceOneAdapter<I, O> {
@Autowired
private GenericWSTemplate<I, O> wsTemplate;
private O execute(I request) {
O response = wsTemplate.callWebService("http://example.com/resource_1", new WebServiceMessageCallback() {
@Override
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
createRequest(request, message);
}
});
}
private void WebServiceMessageCallbackRequest(final I request, WebServiceMessage message) throws IOException {
TransportContext transportContext = TransportContextHolder.getTransportContext();
HttpComponentsConnection connection = (HttpComponentsConnection) transportContext.getConnection();
connection.getHttpPost().addHeader("Authorization", String.format("%s %s", "Basic user1:password1")).getBytes())));
// ...
// mainpulate & set request
// ...
}
}
@Component
public class GetResourceTwoAdapter<I, O> {
@Autowired
private GenericWSTemplate<I, O> wsTemplate;
private O execute(I request) {
O response = wsTemplate.callWebService("http://example.com/resource_2", new WebServiceMessageCallback() {
@Override
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
createRequest(request, message);
}
});
}
private void WebServiceMessageCallbackRequest(final I request, WebServiceMessage message) throws IOException {
TransportContext transportContext = TransportContextHolder.getTransportContext();
HttpComponentsConnection connection = (HttpComponentsConnection) transportContext.getConnection();
connection.getHttpPost().addHeader("Authorization", String.format("%s %s", "Basic user2:password2")).getBytes())));
// ...
// mainpulate & set request
// ...
}
}
Это решение работает для одного сервиса. Но когда я использую две службы с разными учетными данными, я получаю исключение 401-Не авторизовано .
Для меня это выглядит как состояние гонки или проблема безопасности потока. В таком случае, как я могу изменить свой код, чтобы избежать проблемы переопределения учетных данных?