当前位置: 首页 > 知识库问答 >
问题:

从IntegrationFlows返回ObjectNode时的奇怪行为

赵元白
2023-03-14
 @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()));
}

但是,当从handleAsyncErrors()流链接ObjectNode并到达相同的httpCallbackFlow()时,我们会得到一个异常,该异常由

restClientException:无法写入请求:在org.springframework.web.client.restTemplate$HttpEntityRequestCallback.dowithRequest(restTemplate.java:811)在org.springframework.web.client.restTemplate.doExecute(restTemplate.java:594)在org.springframework.web.client.restTemplate.execute(restTemplate.java:572)在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个答案

姜弘化
2023-03-14

错误流上的消息没有ContentType标头。

它是带有MessagingException有效负载的错误消息;具有2个性质;原因失败消息

大概您在主流消息上有一个内容类型。您可以使用标题enricher设置内容类型,或添加

.<MessagingException, Message<?>>transform(p -> p.getFailedMessage())
 类似资料:
  • 问题内容: 尝试这段代码。为什么getValueB()返回1而不是2?毕竟,递增两次被调用两次。 问题答案: 毕竟,递增两次被调用两次。 是的,但是返回值是 在 第二次调用 之前 确定的。 返回的值由该 时间点在 return语句中的表达式求值确定,而不是“仅在执行离开方法之前”。 从JLS的14.17节开始: 一个带有Expression的return语句试图将控制权转移到包含它的方法的调用者;

  • 问题内容: 有没有人看到像这样的方法签名后放置的数组? 版画 过去,“ C”兼容性是一种奇怪的表示法,但我也无法想象有人用C编写这种代码。 有谁知道为什么甚至允许这样做? 如果有问题,我正在使用Java 7 update 10。 这与Java 6中的功能相同。http://ideone.com/91rZV1 顺便说一句,这不会编译,我也不希望它编译 问题答案: 有谁知道为什么甚至允许这样做? 在这

  • 我将数据保存到会话中,但是我尝试将其读回,结果为空。Spring MVC是我的后端,Angular 4是前端。 爪哇: 角: 你知道我错过了什么吗?也许是CORS的事?

  • 我正在使用Mapstruct映射将一个POJO转换为另一个POJO模型 以下是mapstruct自动生成的方法 该方法基本上获取源POJO的映射,并将其转换为目标模型的映射。生成正在通过。 当我运行代码时,我在这个方法中得到了ClassCast异常:HeaderAttributeGenericDataTypeMaptoStringEnergiectAttributeDataMap 堆栈跟踪: 我还

  • 我的程序读取一个自定义生成的字符串,它遵循以下模式: #INT{0,1,2}/STRING/LONG#INT{0,1,2}/STRING/LONG## 这是字符串开头和结尾的一个散列,分隔每个子字符串,每个子字符串包含0-2的int、字符串名称和长值(取自系统时钟)。这些子值由前斜杠分隔。 我的程序成功地在函数“splitOnHash”的散列上拆分了主字符串,并将其分配给一个字符串数组列表,我可以

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方