2017-05-11 5 views
1

Ich bin neu zu Feder Integration mit DSL und haben Schwierigkeiten in extrahieren Nutzlast innerhalb http-Handler, um den URI dynamisch zu konstruieren. Der unten beschriebene Integrationsfluss wird vom AccountList-Gateway ausgelöst und fügt der Nachricht beim Aufruf auf dem Kanal "accountListFlow.input" die Kundennummer hinzu. Und die Nutzlast enthält nur '123766123' und das ist die Kunden-ID bestanden.Spring Integration extrahieren Nutzlast in Handler

Danach wird die Nachricht mit Kopfzeile angereichert und dann Downstream an Handler übergeben.

Ich benötige, dass die Kundennummer im Handler extrahiert wird, um den URI dynamisch zu erstellen. Ich habe versucht, Generic-Handler und Payload auf String, aber nicht sagen, kann nicht Lambda-Objekt zu werfen. Irgendwelche Hilfe hier, wie extrahieren Sie die Nutzlast als Ganzes, die die Kundennummer ist, wenn den URI bauen, bitte?

@MessagingGateway 
public interface AccountList { 

    @Gateway(requestChannel = "accountListFlow.input") 
    List<String> accountListFlow(String customerId); 
} 


@Bean 
public IntegrationFlow accountListFlow() { 
    return flow -> flow.publishSubscribeChannel(s -> s.applySequence(true) 
          .subscribe(f -> f 
             .enrichHeaders(h -> h.header("X-CUST-IP-Id","145.26.54.24")) 
          .handle((o, map) -> 
Http.outboundGateway("http://get-customers-product-holdings-gb-hbeu-v3-v3-cert.cf.wgdc-drn-01.cloud.uk/api/customers/"+(String)o+"/product-holdings?categoryCode=cc,cbs,sd") 
    .httpMethod(HttpMethod.GET) 
    .mappedRequestHeaders("X-CUST-IP-Id") 
    .expectedResponseType(String.class) 
    .extractPayload(true)).channel("aggregateAccount.input")); 
} 

Antwort

0

try ...

.handle(Http.outboundGateway("http://get-customers-product-holdings-gb-hbeu-v3-v3-cert.cf.wgdc-drn-01.cloud.uk/api/customers/{customer}/product-holdings?categoryCode=cc,cbs,sd") 
    .httpMethod(HttpMethod.GET) 
    .mappedRequestHeaders("X-CUST-IP-Id") 
    .expectedResponseType(String.class) 
    .uriVariable("customer", "payload") 
    .extractPayload(true)) 
.channel("aggregateAccount.input")); 

Beachten Sie die {customer} Variable in der URL.

+0

Vielen Dank Gary. Es funktioniert wie erwartet. Ich konnte Payload nicht als Wert verwenden, aber uriVariable ("customerId", message -> message.getPayload(). ToString()) löste es! –

+0

Sorry, 'Nutzlast' sollte" Nutzlast "sein. –

+0

Danke Gary. Es wirkt wie ein Zauber!. –