我正在尝试使用混合了@Bean定义的DSL样式流来设置Spring Integration流。在此示例中,我尝试将传入的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();
}
答案 0 :(得分:2)
有一个
/**
* 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
可用。 / p>
由于您已将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())