316.3. Samples


316.3.1. 表达式模板

因为启用了表达式模板,SpEL 表达式需要被 #{ } delimiters 括起。这可让您将 SpEL 表达式与常规文本组合,并把它用作非常轻量级的模板语言。

例如,如果您构建以下路由:

from("direct:example")
    .setBody(spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}"))
    .to("mock:result");

在上面的路由中,注意 spel 是一个静态方法,我们需要从 org.apache.camel.language.spel.SpelExpression.spel 导入,因为我们将 spel 用作传递至 setBody 方法的参数。虽然我们使用流畅的 API,我们可以这样做:

from("direct:example")
    .setBody().spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}")
    .to("mock:result");

注意我们现在使用 setBody () 方法中的 spel 方法。这不要求我们静态导入 org.apache.camel.language.spel.SpelExpression.spel 的 spel 方法。

并在正文中发送一条字符串 "World" 的消息,并发送标题 "dayOrNight",值为 "day":

template.sendBodyAndHeader("direct:example", "World", "dayOrNight", "day");

mock:result 的输出为 "Hello World!这一天是什么?"

316.3.2. Bean 集成

您可以在 SpEL 表达式中引用 Registry (最有可能为 ApplicationContext)中定义的 Bean。例如,如果您在 ApplicationContext 中有一个名为 "foo" 的 bean,您可以在这个 bean 上调用 "bar" 方法,如下所示:

#{@foo.bar == 'xyz'}

316.3.3. 企业级集成模式中的 SpEL

您可以使用 SpEL 作为 Recipient List 的表达式,或作为 Message Filter 中的 predicate :

<route>
  <from uri="direct:foo"/>
  <filter>
    <spel>#{request.headers['foo'] == 'bar'}</spel>
    <to uri="direct:bar"/>
  </filter>
</route>

以及 Java DSL 中的等效功能:

from("direct:foo")
    .filter().spel("#{request.headers['foo'] == 'bar'}")
    .to("direct:bar");
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.