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

Apache Camel RESTendpoint不返回最终主体

花阳辉
2023-03-14

我声明了一个RESTendpoint,它使用direct调用另一个路由。在第二条路由的末尾,我记录了正文,但它与返回到浏览器的正文不同。

@Component
public class EntidadeRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        restConfiguration().bindingMode(json);

        rest("/entidade")
            .get("/{id}")
                .to("direct:search-by-id");

        from("direct:search-by-id")
            .routeId("search-by-id")
            .setProperty("idEntidade", simple("${header.id}"))
            .pollEnrich("file:files/mock/dados?noop=true&idempotent=false")
            .unmarshal().json(JsonLibrary.Jackson)
            .split(jsonpath("$"))
            .filter(jsonpath("$[?(@.id == ${property.idEntidade})]"))
            .marshal().json(JsonLibrary.Jackson)
            .log("${body}");
    }
}

我知道拆分和过滤器正在工作,因为我在最后一行代码中记录了正文,这就是日志中出现的内容:

2021-04-28 18:15:15.707信息3905542---[nio-8080-exec-1]按ID搜索:{“ID”:“1”,“Tipo”:“PF”,“NOME”:“João Maria”}

但这是返回给浏览器的内容(entidades.json文件的确切内容):

[{“id”:“1”,“tipo”:“pf”,“nome”:“若昂·玛丽亚”},{“id”:“2”,“tipo”:“pf”,“nome”:“玛丽亚·若昂”},{“id”:“3”,“tipo”:“pf”,“nome”:“若昂·席尔瓦”},{“id”:“4”,“tipo”:“pf”,“nome”:“何塞·索萨”}]

为什么记录的正文与浏览器中显示的不一样,并修复它?

PS:如果我删除这些封送和反封送调用,我会在浏览器中得到以下错误:

共有1个答案

相旭
2023-03-14

错误是我需要将aggregationStrategy传递给split。我还需要停止记录主体,因为它正在消耗InputStream。在此之后,我可以安全地删除那些封送和反封送调用

这是最后的代码:

@Component
public class EntidadeRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        restConfiguration().bindingMode(json);

        rest("/entidade")
            .get("/{id}")
                .to("direct:search-by-id");

        from("direct:search-by-id")
            .routeId("search-by-id")
            .setProperty("idEntidade", simple("${header.id}"))
            .pollEnrich("file:files/mock/dados?noop=true&idempotent=false")
            .split(jsonpath("$"), takeFirst(Exchange.FILTER_MATCHED))
                .filter(jsonpath("$[?(@.id == ${property.idEntidade})]")).stop()
            .end();
    }

    private AggregationStrategy takeFirst(String matchProperty) {
        return ((oldExchange, newExchange) -> {
            if (oldExchange == null && newExchange.getProperty(matchProperty, Boolean.class)) {
                oldExchange = newExchange;
            }
            return oldExchange;
        });
    }
}
 类似资料:
  • 问题内容: 考虑到此代码,我是否可以 绝对确定 该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果您调用 如果您调用 如果JVM首先崩溃 如果JVM在或块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM进程;例如,在UNIX上 如果主机系统死机;例如,电源故障,硬件错误,操作系统崩溃等 如果该块将由守护程序线程执行并

  • 问题内容: 我觉得有点愚蠢,但它不起作用: 我有如果给定的用户是unicode。如果字符串中包含或,我想打印成功,但是我总是得到的结果。 问题答案: 隐式锚定到字符串的开头。如果要在字符串中搜索可以在字符串中任何位置的子字符串,则需要使用: 输出: 另外,Python Regexes不需要在开头和结尾都有一个。 最后,我添加到该行的末尾,因为我认为这就是您想要的。否则,您会得到类似的信息,但并不太

  • 问题内容: 下面是有趣的代码: 可以请人解释一下,什么结果将返回这两个函数并解释原因,即描述执行的顺序 问题答案: 从Python文档 无论是否发生异常,finally子句始终在离开try语句之前执行。如果try子句中发生了异常且未由except子句处理(或在except或else子句中发生),则在执行finally子句后重新引发该异常。 当try语句的任何其他子句通过break,continue

  • 问题内容: 在Java中,尝试{…}最终{…}在我看来有点不直观。如另一个问题所示,“最终是否总是在Java中执行?,如果try块中有return语句,则在定义了finally块的情况下将忽略该语句。例如功能 将始终返回false。我的问题:这是为什么?Java做出的这种设计决策背后是否有特定的哲学?我感谢任何见解,谢谢。 编辑:我对“为什么” Java认为可以违反我定义的语义特别感兴趣。如果我在

  • 问题内容: 请参见以下代码,并解释输出行为。 结果是返回Val:10。 Eclipse显示警告:。 catch块中的return语句会怎样? 问题答案: 它被中的一个覆盖,因为它在所有其他操作之后执行。 这就是为什么,经验法则- 永不从回归。例如,Eclipse显示了该代码段的警告:“最终阻止无法正常完成”

  • 问题内容: 我以前使用过媒体播放器,但从未遇到过此问题。每当我尝试使用MediaPlayer.create()时,该方法都会使我为null,并且无法播放声音。有什么我想念的吗? 我的sound.mp3在我的原始文件夹中,通过将声音拖到eclipse中的文件夹中,我将其放置在其中。请帮忙,因为我以前玩过声音,所以这真的困扰我:( 问题答案: 如果create() API由于某种原因失败,则返回nul