Использование общего WebServiceGatewaySupport для использования нескольких сервисов с разными учетными данными - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть два веб-сервиса с разными учетными данными авторизации. Я пытаюсь создать общую базу 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-Не авторизовано .

Для меня это выглядит как состояние гонки или проблема безопасности потока. В таком случае, как я могу изменить свой код, чтобы избежать проблемы переопределения учетных данных?

...