Tengo que escribir el flujo de Integración de primavera para el siguiente pasos:
(1) Leer JSON archivos de un directorio
(2) se transforman en objetos de Java y el encabezado complemento
(3) Transformar para JSON
(4) Compartir en punto final: Enviar http://127.0.0.1:8081/v1/userValidation
(5) Extracto de respuesta a un objeto Java llama 'UserValidationResponse'. La respuesta tiene un campo llamado orderID que será utilizado en el paso 7.
(6) de salida de escritura a un canal llamado 'userValidationPostOutputWriterChannel'. Este canal registrará el estado HTTP.
(7) poner en punto final: PUT http://127.0.0.1:8081/v1/userValidation/ {orderID extrajo en el paso 5} / cancelar.
(8) de salida de escritura en un canal llamado 'userValidationPostCancelOutputWriterChannel'. Este canal registrará el estado HTTP.
LO QUE NECESITO:
Cómo construir la URL http://127.0.0.1:8081/v1/userValidation/ {orderID} / cancelar de forma dinámica?
Lo busqué en línea y encontró que tengo que utilizar un parámetro URI.
¿Puede usted por favor, dame un ejemplo mediante programación?
Sólo pude encontrar ejemplos de configuración utilizando XML, y tengo XML NO config en mi código.
CÓDIGO DE MUESTRA:
@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();
}
RESPUESTA muestra a partir de la 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"
}
La siguiente ejecución debe ser un PUT http://127.0.0.1:8081/v1/userValidation/78e323f7-d3f9-11e9-a71a-035a2a38a4e0/cancel .
Está totalmente bien tener que URI en la puerta de enlace HTTP saliente configurado de esta manera:
http://127.0.0.1:8081/v1/userValidation/{orderID}/cancel
Esto se llama template
. Que tiene allí que orderID
uriVariable . El Http.outboundGateway
tiene soporte para que así:
/**
* 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) {
Por lo tanto, para su caso de uso debe ser algo como esto:
.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"))