Использование MarshallingWebServiceOutboundGateway с динамическим URI c на основе заголовка сообщения - PullRequest
1 голос
/ 06 марта 2020

У меня есть следующая конфигурация для отправки SOAP запросов в рамках процесса интеграции, где uriDefinedInApplicationProperties - это фиксированный uri, определенный в файле application.properties:

@Bean
public MarshallingWebServiceOutboundGateway outboundSOAPGateway()
{
    final MarshallingWebServiceOutboundGateway outboundGateway = new MarshallingWebServiceOutboundGateway(
            uriDefinedInApplicationProperties,
            requestMarshaller,
            responseMarshaller);
    outboundGateway.setAdviceChain(Collections.singletonList(retryOutboundGatewayAdvice));
    if (soapActionCallback!= null) {
        outboundGateway.setRequestCallback(soapActionCallback);
    }
    return outboundGateway;
}

Теперь я есть требование, чтобы URI удаленного SOAP сервера создавался динамически (я планирую использовать заголовки сообщений для хранения URI).

Я хотел сделать что-то вроде следующего, но MarshallingWebServiceOutboundGateway делает кажется, не поддерживает, и я не смог найти, как сделать что-то подобное, используя пружинную интеграцию DSL:

@Bean
public MarshallingWebServiceOutboundGateway outboundSOAPGateway()
{
    final MarshallingWebServiceOutboundGateway outboundGateway = new MarshallingWebServiceOutboundGateway(
            message -> (message -> message.getHeaders().get("remote.uri.header"),
            requestMarshaller,
            responseMarshaller);
    outboundGateway.setAdviceChain(Collections.singletonList(retryOutboundGatewayAdvice));
    if (soapActionCallback!= null) {
        outboundGateway.setRequestCallback(soapActionCallback);
    }
    return outboundGateway;
}

Я заметил, что MarshallingWebServiceOutboundGateway имеет метод setUriVariableExpressions(Map<String, Expression> uriVariableExpressions), но я не нашел четкой документации о том, что он должен делать и как он работает.

Также я попытался сделать что-то вроде следующего для создания исходящего шлюза, но, похоже, он не поддерживает requestCallbacks или совет chain.

Http.outboundGateway(message -> message.getHeaders().get("remote.uri.header"))
            .messageConverters(new MarshallingHttpMessageConverter(
                    remoteRequestMarshaller,
                    remoteResponseMarshaller));

Каков наилучший способ создания исходящего шлюза SOAP с рекомендациями по повторным попыткам и сгенерированным динамически URI?

1 Ответ

2 голосов
/ 06 марта 2020

Конфигурация advice не является ответственностью MessageHandler. Если вы используете Java DSL, см. Второй аргумент (GenericEndpointSpec лямбда) handle(), который вы используете для этого MarshallingWebServiceOutboundGateway:

/**
 * Configure a list of {@link Advice} objects to be applied, in nested order, to the
 * endpoint's handler. The advice objects are applied only to the handler.
 * @param advice the advice chain.
 * @return the endpoint spec.
 */
public S advice(Advice... advice) {

Да, я согласен, что MarshallingWebServiceOutboundGateway ( и его суперкласс) не поддерживает разрешение URI для сообщения в данный момент. Не стесняйтесь поднимать проблему GH, чтобы исправить разрыв с конфигурацией SpEL, как у нас для упомянутого Http.outboundGateway.

Между тем, в качестве обходного пути вы можете рассмотреть возможность реализации DestinationProvider, который читает URI из TheadLocal магазин. Перед вызовом этого шлюза вы должны просмотреть ваше сообщение и сохранить встроенный URI в этой переменной ThreadLocal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...