2016-02-12 2 views
0

Когда ObjectNode передается от extractFramesFlow() и достигает httpCallbackFlow(), запрос HTTP успешно выполняется и JSON отформатирован полезной нагрузки «POST'ed к„call_back“ URI указан ,Странное поведение при возвращении из ObjectNode IntegrationFlows

@Bean 
public IntegrationFlow extractFramesFlow() { 
    return IntegrationFlows.from(extractFramesChannel()) 
      .handle(ObjectNode.class, (payload, headers) -> { 
     payload = validateFields(payload); 
     String path = payload.get("path").asText(); 
     try { 
      File moviePath = new File(path); 
      ArrayNode arrayNode = mapper.createArrayNode(); 
      String imageType = payload.path("image_type").asText("JPG"); 
      String prefix = payload.path("prefix").asText(); 
      Tools.thumbnails(moviePath, payload.get("slice").asInt(), payload.get("scale").asInt(), 
        imageType, prefix, file -> arrayNode.add(file.toString())); 
      payload.set("files", arrayNode); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return payload; 
    }).enrichHeaders(h-> h.header("errorChannel", "asyncErrorChannel", true)) 
      .<ObjectNode, Boolean>route(p-> !p.hasNonNull("id"), 
      m->m.channelMapping("true","httpCallbackFlow.input") 
        .channelMapping("false","uploadToS3Channel")).get(); 
} 

@Bean 
public IntegrationFlow httpCallbackFlow() { 
    return f->f.handle(Http.<JsonNode>outboundChannelAdapter(m->m.getPayload().get("call_back").asText())); 
} 

Однако, когда ObjectNode прикован от handleAsyncErrors() потока и достигает того же httpCallbackFlow(), мы получаем исключение, которое вызывается

org.springframework.web.client.RestClientException: Не удалось написать запрос: не найдено подходящего HttpMessageConverter для типа запроса [com.fasterxml.jackson.databind.node.ObjectNode] и типа содержимого [application/x-java-serialized-object] на org.springframework.web.client.RestTemplate $ HttpEntityRequestCallback.doWithRequest (RestTemplate.java:811) at org.springframework.web.client.RestTemplate.doExecute (RestTemplate.java:594) на org.springframework.web.client.RestTemplate.execute (RestTemplate.java:572) на org.springframework.web.client.RestTemplate.exchange (RestTemplate.java:493) на org.springframework.integration.http. outbound.HttpRequestExecutingMessageHandler.handleRequestMessage (HttpRequestExecutingMessageHandler.java:382) ... 24 более

@Bean 
public IntegrationFlow handleAsyncErrors() { 
    return IntegrationFlows.from(asyncErrorChannel()) 
      .<MessagingException>handle((p, h) -> { 
       ObjectNode objectNode = mapper.createObjectNode(); 
       objectNode.put("call_back", "http://some.test.uri"); 
       return objectNode; 
      }).channel("httpCallbackFlow.input").get(); 
} 

Я не знаю, почему мы получаем это исключение обрабатывается точно такой же IntegrationFlow несмотря.

ответ

1

Сообщение об ошибке не имеет заголовка contentType.

Это сообщение об ошибке с полезной нагрузкой MessagingException; который имеет 2 свойства; cause и failedMessage.

Предположительно, у вас есть тип контента в сообщении основного потока. Вы можете установить тип содержимого с обогатителем заголовка, или добавить

.<MessagingException, Message<?>>transform(p -> p.getFailedMessage()) 

до вашего существующего обработчика ошибок, чтобы восстановить заголовки из неуспешного сообщения.

+0

Благодарим за отзыв, вы правы. IntegrationFlow принимает запрос POST от http-клиента, а его значение contentType имеет значение «application/json», как вы указали. Сообщение обрабатывается асинхронно, и результат будет отправлен обратно на URL-адрес «call_back», определенный в полезной нагрузке запроса, которая является JSON. Это не может быть хорошей практикой для повторного использования заголовка таким образом. – hanishi

+0

Да; было бы лучше явно указать «contentType» с расширением заголовка (overwrite = true), а не полагаться на то, что он устанавливается каким-то компонентом восходящего потока (например, наследует его от входящего запроса). –