0

我有一个camel-spring-boot 项目,我在其中使用Spring 的@ConfigurationProperties 从一个yml 文件加载目标url。由于我的目的地是一个 HTTP url,我正在使用 camel-http4 组件。

现在我的 URL 是https://example.com/students/{id}/subject/{name },这意味着我必须将 id 和 name 参数作为路径变量(而不是查询参数)传递。我的问题是如何传递这些参数?[注意:我不能将 URL 放在 DSL 或 XML 中,它必须在 application.yml 中]

但是,作为解决方案

//in some processor before toD()
headers.put("id", id);
headers.put("name", name);

//in yml
destination: https4://example.com/students/${header.id}/subject/${header.name}

但是在从 yml 加载此属性时,Spring 尝试将 ${header.id} 评估为 Spel 表达式(并抛出找不到它的错误),正如我提到的那样,它是 Camel 的简单表达式。如果我使用 DSL,则相同的表达式适用于 toD(),但不适用于 yml。

请告诉我,我的方法是否正确?如果是这样,那我该如何摆脱这个问题。提前致谢。

4

2 回答 2

1

如果我没记错的话,由于缓存大小,我们应该注意使用动态路由。

更清洁的解决方案可能是:

YAML 文件:

cfg:
  target:
    url: 'https4://example.com'

Java DSL:

Expression dynamicPathExpression = constant("students/")
    .append(header("id"))
    .append(constant("/subject/"))
    .append(header("name"));

from("direct://whatever")
  .setHeader(Exchange.HTTP_PATH, dynamicPathExpression)
  .to("{{cfg.target.url}}");

那会帮助你吗?

于 2020-06-11T19:18:55.067 回答
0

我得到了第二个问题的答案,即如何区分简单表达式和 Spel

destination: https4://example.com/students/$simple{header.id}/subject/$simple{header.name}

$simple{exp} 是 ${exp} 的另一种方式

但是我的第一个问题仍然存在,是否推荐使用路径变量调用 http 端点的方法?

于 2020-06-11T11:32:22.023 回答