Eu tenho que escrever fluxo Spring Integration para o abaixo passos:
(1) arquivos Leia JSON de um diretório
(2) transformação de objecto de Java e cabeçalho suplemento
(3) Transformação para JSON
(4) Adicione a ponto final: POST http://127.0.0.1:8081/v1/userValidation
(5) resposta Extrair para um objeto Java chamado 'UserValidationResponse'. A resposta tem um campo chamado orderID que será usado na etapa 7.
(6) gravar a saída a um canal chamado 'userValidationPostOutputWriterChannel'. Este canal vai registar o estado de HTTP.
(7) PUT em ponto final: PUT http://127.0.0.1:8081/v1/userValidation/ {orderID extraído no passo 5} / cancelar.
(8) escrever a saída de um canal de chamada 'userValidationPostCancelOutputWriterChannel'. Este canal vai registar o estado de HTTP.
O QUE EU PRECISO:
Como construir a URL http://127.0.0.1:8081/v1/userValidation/ {orderID} / cancelar dinamicamente?
Eu olhei para cima on-line e descobriram que eu tenho que usar um parâmetro uri.
Você pode por favor me dar um exemplo de programação?
Eu só poderia encontrar exemplos usando XML de configuração, e eu tenho XML NO configuração no meu código.
CÓDIGO DE AMOSTRA:
@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();
}
RESPOSTA DA AMOSTRA DE POST http://127.0.0.1:8081/v1/userValidation :
{
"status": "CREATED",
"orderID": "78e323f7-d3f9-11e9-a71a-035a2a38a4e0",
"userData" : {
"userFName": "John",
"userLName": "Smith",
"userLocation": "Florida"
},
"userAccess": "USER"
}
A próxima execução deve ser um PUT http://127.0.0.1:8081/v1/userValidation/78e323f7-d3f9-11e9-a71a-035a2a38a4e0/cancel .
É totalmente OK para ter esse URI no HTTP de saída gateway configurado como este:
http://127.0.0.1:8081/v1/userValidation/{orderID}/cancel
Isso é chamado template
. Você tem lá que orderID
uriVariable . O Http.outboundGateway
tem suporte para isso também:
/**
* 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) {
Assim, para o seu caso de uso deve ser algo como isto:
.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"))