2017-09-19 2 views
0

Ich benutze Spring-Integration, um einige HTTP-Anfrage zu tun und dann analysieren es schließlich speichern in der Datenbank Ich möchte Zugriff auf App Objekt in konvertieren Methode, wie Sie sehen können App Objekt ist Argument der download Methode (die von einem anderen Kanal aufgerufen wird), Was ist die Lösung?
Hier ist mein Code:Spring Integration über mehrere Argumente zwischen Methoden

@ServiceActivator(inputChannel = "channel1", outputChannel = "channel2") 
public ResponseEntity<DetailsItemParser[]> download(App app) 
{ 
    String url = config.getAppDetailUrl(); 
    try 
    { 
     SSLUtil.turnOffSslChecking(); 
    } 
    catch (Exception e) 
    { 
     LOG.error(e.getMessage()); 
    } 
    HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.setAccept(Collections.singletonList(new MediaType("application","json"))); 
    HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders); 
    detailsCrawlerRestTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
    ResponseEntity<DetailsItemParser[]> responseEntity = detailsCrawlerRestTemplate.exchange(url, HttpMethod.GET, requestEntity, DetailsItemParser[].class, app.getExternalId()); 

    return responseEntity; 

} 

@Splitter(inputChannel = "channel2", outputChannel = "channel3") 
public List<DetailsItemParser> scrape(ResponseEntity<DetailsItemParser[]> payload) 
{ 
    return new ArrayList<>(Arrays.asList(payload.getBody())); 
} 



@Filter(inputChannel = "channel3", outputChannel = "channel4") 
public boolean filter(DetailsItemParser detailsItemParser) 
{ 
    final Set<ConstraintViolation<DetailsItemParser>> violations = validator.validate(detailsItemParser); 
    if (violations != null && !violations.isEmpty()) 
    { 
     return false; 
    } 

    return true; 
} 

@Transformer(inputChannel = "channel4", outputChannel = "channel5") 
public App convert(DetailsItemParser payload) 
{ 

    App app = appRepository.findById(payload.getId()); 

    LOG.info("entry={}", o.toString()); 
    return null; 
} 

Antwort

1

Mehrere Argumente sind möglich, wenn Sie für die payload genaue Übereinstimmung haben, muss alles Rest über @Header konfiguriert werden. Sie können nicht zwei payload haben, sowie Sie können nicht zwei Rückgaben von Java-Methode haben.

Also, wenn Sie App Objekt neben der ResponseEntity<DetailsItemParser[]> tragen möchten, ziehen Sie es in die headers.

können Sie HeaderEnricher verwenden, bevor ein ganzes Message<?> vom download() Verfahren zum channel1 oder Rückkehr zu senden, und fügen Sie AppMessageBuilder mit dem Kopf.

Die convert() Verfahren kann dann wie folgt angegeben werden:

public App convert(DetailsItemParser payload, @Header("app") App app) 

UPDATE

Die HeaderEnricher Probe über Java Config:

@Bean 
    @Transformer(inputChannel = "routingSlipHeaderChannel", outputChannel = "processChannel") 
    public HeaderEnricher headerEnricher() { 
     return new HeaderEnricher(Collections.singletonMap(IntegrationMessageHeaderAccessor.ROUTING_SLIP, 
       new RoutingSlipHeaderValueMessageProcessor(routeStrategy()))); 
    } 

Weitere Informationen im Handbuch Referenz: https://docs.spring.io/spring-integration/reference/html/messaging-transformation-chapter.html#_configuring_a_header_enricher_with_java_configuration

+0

Danke. Wie kann ich HeaderEnricher mit Spring Boot und Java verwenden? – Ali

+0

Können Sie bitte einen Beispiel-Java-Code mit HeaderEnricher schreiben? – Ali

+0

Siehe ein UPDATE in meiner Antwort. –