Java Spring集成-如何以编程方式使用uri参数/url表达式?

Java Spring集成-如何以编程方式使用uri参数/url表达式?,java,spring-integration,uri,Java,Spring Integration,Uri,我必须为以下步骤编写Spring集成流: (1) 从目录中读取json文件 (2) 转换为Java对象并添加标题 (3) 转换为JSON (4) Post到终点:Post (5) 提取对名为“UserValidationResponse”的Java对象的响应。响应有一个名为orderID的字段,将在步骤7中使用 (6) 将输出写入名为“userValidationPostOutputWriterChannel”的通道。此通道将记录Http状态 (7) 放置在端点上:放置{orderID在步骤5中

我必须为以下步骤编写Spring集成流:

(1) 从目录中读取json文件

(2) 转换为Java对象并添加标题

(3) 转换为JSON

(4) Post到终点:Post

(5) 提取对名为“UserValidationResponse”的Java对象的响应。响应有一个名为orderID的字段,将在步骤7中使用

(6) 将输出写入名为“userValidationPostOutputWriterChannel”的通道。此通道将记录Http状态

(7) 放置在端点上:放置{orderID在步骤5中提取}/取消

(8) 将输出写入名为“UserValidationPostCancelOutWriterChannel”的通道。此通道将记录Http状态

我需要什么:

{
    "status": "CREATED", 
    "orderID": "78e323f7-d3f9-11e9-a71a-035a2a38a4e0",
    "userData" : {
            "userFName": "John",
            "userLName": "Smith",
            "userLocation": "Florida"
        },
    "userAccess": "USER"    
}
如何动态构造URL{orderID}/cancel?

我在网上查了一下,发现我必须使用一个uri参数

你能以编程的方式给我举个例子吗

我只能找到使用配置XML的示例,代码中没有配置XML

示例代码:

@Bean
public IntegrationFlow placeUserRequest(RestTemplate restTemplate) {
private String AUTHORIZATION = "USER";

    return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10000)))
            .transform(Transformers.fromJson(UserRequest.class))
            .enrichHeaders(h -> h.header("Content-Type", "application/json"))
            .transform(Transformers.toJson())
            .handle(Http.outboundGateway("http://127.0.0.1:8081/v1/userValidation", restTemplate)
                    .httpMethod(HttpMethod.POST)
                    .mappedRequestHeaders("auth*", "TraceabilityID", AUTHORIZATION)
                    .charset("UTF-8")
                    .expectedResponseType(UserValidationResponse.class))
            .wireTap(flow -> flow.channel("userValidationPostOutputWriterChannel"))
            .handle(Http.outboundGateway("http://127.0.0.1:8081/v1/userValidation/" + parser.parseExpression("payload.getOrderID()") + "/cancel", restTemplate)
                    .httpMethod(HttpMethod.PUT)
                    .mappedRequestHeaders("auth*", "TraceabilityID", AUTHORIZATION)
                    .charset("UTF-8").expectedResponseType(Map.class))
            .wireTap(flow -> flow.channel("userValidationPostCancelOutputWriterChannel"))
            .get();
}
发帖回复样本:

{
    "status": "CREATED", 
    "orderID": "78e323f7-d3f9-11e9-a71a-035a2a38a4e0",
    "userData" : {
            "userFName": "John",
            "userLName": "Smith",
            "userLocation": "Florida"
        },
    "userAccess": "USER"    
}

下一次执行应该是PUT

在HTTP出站网关上配置该URI完全可以:

 http://127.0.0.1:8081/v1/userValidation/{orderID}/cancel
 .handle(Http.outboundGateway("http://127.0.0.1:8081/v1/userValidation/{orderID}/cancel", restTemplate)
                .httpMethod(HttpMethod.PUT)
                .mappedRequestHeaders("auth*", "TraceabilityID", AUTHORIZATION)
                .charset("UTF-8").expectedResponseType(Map.class)
                .uriVariable("orderID", "payload.orderID"))
这称为
模板
。这里有一个
orderID
uriVariable。Http.outboundGateway也支持此功能:

/**
 * Specify a value SpEL expression for the uri template variable.
 * @param variable the uri template variable.
 * @param expression the expression to evaluate value for te uri template variable.
 * @return the current Spec.
 * @see AbstractHttpRequestExecutingMessageHandler#setUriVariableExpressions(Map)
 */
public S uriVariable(String variable, String expression) {
因此,对于您的用例,它必须是这样的:

 http://127.0.0.1:8081/v1/userValidation/{orderID}/cancel
 .handle(Http.outboundGateway("http://127.0.0.1:8081/v1/userValidation/{orderID}/cancel", restTemplate)
                .httpMethod(HttpMethod.PUT)
                .mappedRequestHeaders("auth*", "TraceabilityID", AUTHORIZATION)
                .charset("UTF-8").expectedResponseType(Map.class)
                .uriVariable("orderID", "payload.orderID"))

阿尔特姆·比兰/加里·拉塞尔-你能帮忙吗?