Spring Integration - передача параметров и потока от входящего шлюза WebFlux к исходящему шлюзу WebFlux - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь настроить поток Spring Integration, используя потоки в стиле DSL, смешанные с определениями @Bean.В этом примере я пытаюсь передать входящий REST-запрос (restCustomerGateway) в качестве входящего шлюза webflux.Я видел, что вы можете использовать .payloadExpression для извлечения вещей из запроса (в этом случае параметр пути id ... будет вставлен, если есть лучшие или более безопасные способы).

Затем я передаю его висходящий шлюз webflex (restCustomerSource) для выполнения нисходящего вызова, который затем следует направить обратно на входящий шлюз в качестве ответа.Обратите внимание, что в конечном итоге между ними будут преобразователи для преобразования полезной нагрузки / и т. Д.

Простой вопрос: как мне структурировать это так, чтобы у меня был доступ к «id» (параметру пути, в настоящее время жестко заданному в «1 'в вызове исходящего шлюза)?Я предполагаю, что это часть полезной нагрузки сообщения, которая течет между ними, но как мне с этим справиться?

@Bean
public WebFluxInboundEndpoint restCustomerGateway() {
    return WebFlux.inboundGateway("/rest/customers/{id}")
        .requestMapping(m -> m.produces(MediaType.APPLICATION_JSON_VALUE)).payloadExpression("#pathVariables.id")
        .get();
}

@Bean
public WebFluxRequestExecutingMessageHandler restCustomerSource() {
    return WebFlux.outboundGateway("http://localhost:8080/customers/1").httpMethod(HttpMethod.GET)
        .expectedResponseType(Customer.class)
        .get();
}

@Bean
public IntegrationFlow restCustomerFlow(CustomerProcessor customerProcessor) {
    return IntegrationFlows
        .from(restCustomerGateway())
        .handle(restCustomerSource())
        .handle(customerProcessor)
        .get();
}

1 Ответ

0 голосов
/ 08 сентября 2018

есть

/**
 * Specify a {@link Function} to evaluate in order to generate the Message payload.
 * @param payloadFunction The payload {@link Function}.
 * @param <P> the expected HTTP request body type.
 * @return the spec
 * @see HttpRequestHandlingEndpointSupport#setPayloadExpression(Expression)
 */
public <P> S payloadFunction(Function<HttpEntity<P>, ?> payloadFunction) {

на WebFluxInboundEndpointSpec, но у вас нет доступа к переменным контекста оценки или даже к исходному ServerWebExchange, в функции доступна только RequestEntity.

Поскольку вы сохранили эту переменную пути id в полезной нагрузке сообщения для отправки вниз по потоку через payloadExpression("#pathVariables.id"), она действительно доступна в WebFlux.outboundGateway() для доступа.

Прямо сейчас у вас есть жестко закодированный uri, но вы можете использовать вместо этого вариант:

/**
 * Create an {@link WebFluxMessageHandlerSpec} builder for request-reply gateway
 * based on provided {@code Function} to evaluate target {@code uri} against request message.
 * @param uriFunction the {@code Function} to evaluate {@code uri} at runtime.
 * @param <P> the expected payload type.
 * @return the WebFluxMessageHandlerSpec instance
 */
public static <P> WebFluxMessageHandlerSpec outboundGateway(Function<Message<P>, ?> uriFunction) {

Итак, ваш конфиг выглядит следующим образом:

WebFlux.outboundGateway(m -> "http://localhost:8080/customers/" + m.getPayload())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...