Когда 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 несмотря.
Благодарим за отзыв, вы правы. IntegrationFlow принимает запрос POST от http-клиента, а его значение contentType имеет значение «application/json», как вы указали. Сообщение обрабатывается асинхронно, и результат будет отправлен обратно на URL-адрес «call_back», определенный в полезной нагрузке запроса, которая является JSON. Это не может быть хорошей практикой для повторного использования заголовка таким образом. – hanishi
Да; было бы лучше явно указать «contentType» с расширением заголовка (overwrite = true), а не полагаться на то, что он устанавливается каким-то компонентом восходящего потока (например, наследует его от входящего запроса). –