第52章 FreeMarker


FreeMarker

freemarker: コンポーネントを使用すると、FreeMarker テンプレートを使用してメッセージを処理できます。これは、Templating を使用してリクエストの応答を生成する場合に理想的です。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-freemarker</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Copy to Clipboard Toggle word wrap

URI 形式

freemarker:templateName[?options]
Copy to Clipboard Toggle word wrap
templateName は、呼び出すテンプレートのクラスパスローカル URI、またはリモートテンプレートの完全な URL (例: file://folder/myfile.ftl)に置き換えます。
URI にクエリーオプションは ?option=value&option=value&.. の形式で追加できます。

オプション

Expand
オプション デフォルト 説明
allowContextMapAll (producer)
false
コンテキストマップが前詳細へのアクセスを許可するかどうかを設定します。デフォルトでは、メッセージの本文とヘッダーにのみアクセスできます。このオプションは、現在の Exchange および CamelContext へのフルアクセスに対して有効にできます。これを行うと、CamelContext API の全機能へのアクセスが開かれるため、潜在的なセキュリティーリスクが発生します。
allowTemplateFromHeader (producer)
false
ヘッダーのリソーステンプレートの使用を許可するかどうか (デフォルトは false)。このオプションを有効にすると、セキュリティーの問題があります。たとえば、ヘッダーに信頼されていないコンテンツやユーザー派生コンテンツが含まれている場合、これは最終的にエンドアプリケーションの信頼性および完全性に影響を与える可能性があるため、このオプションは注意して使用してください。
contentCache true 読み込み時のリソースコンテンツのキャッシュ。注記: Camel 2.9 でキャッシュされたリソースコンテンツは、エンドポイントの clearContentCache 操作を使用して JMX 経由でクリアできます。
encoding null リソースコンテンツの文字エンコーディング。
templateUpdateDelay 5 *Camel 2.9:* 読み込んだテンプレートリソースがキャッシュに留まる秒数。

FreeMarker コンテキスト

Apache Camel は FreeMarker コンテキストで交換情報を提供します(マップのみ Exchange は以下のように転送されます。
Expand
キー
exchange Exchange 自体。
exchange.properties Exchange プロパティー。
ヘッダー In メッセージのヘッダー。
camelContext Camel コンテキスト。
request In メッセージ。
ボディー In メッセージのボディー。
response Out メッセージ(InOut メッセージ交換パターンにのみ有効)。
Camel 2.14 以降では、以下のようにキー CamelFreemarkerDataModel を使用して、メッセージヘッダーにカスタム FreeMarker コンテキストを設定できます。
Map<String, Object> variableMap = new HashMap<String, Object>();
variableMap.put("headers", headersMap);
variableMap.put("body", "Monday");
variableMap.put("exchange", exchange);
exchange.getIn().setHeader("CamelFreemarkerDataModel", variableMap);
Copy to Clipboard Toggle word wrap

ホットリロード

FreeMarker テンプレートリソースは、デフォルトでは、ファイルとクラスパスリソース(展開形式の jar)の両方でホットリロードでき ませんcontentCache=false を設定すると、Apache Camel はリソースをキャッシュせず、ホットリロードが有効になります。このシナリオは開発中に使用できます。

動的テンプレート

Camel 2 .1 Camel では利用可能な 2 つの ヘッダーで、テンプレートまたはテンプレートコンテンツ自体の異なるリソースの場所を定義できます。これらのヘッダーのいずれかが設定されている場合、Camel は設定されたエンドポイントでこれを使用します。これにより、ランタイム時に動的テンプレートを指定できます。
Expand
ヘッダー タイプ 説明 サポートバージョン
FreemarkerConstants.FREEMARKER_RESOURCE org.springframework.core.io.Resource テンプレートリソース <= 1.6.2, <= 2.1
FreemarkerConstants.FREEMARKER_RESOURCE_URI String 設定されたエンドポイントの代わりに使用するテンプレートリソースの URI。 >= 2.1
FreemarkerConstants.FREEMARKER_TEMPLATE String 設定されたエンドポイントの代わりに使用するテンプレート。 >= 2.1

サンプル

たとえば、以下のようなルートを定義できます。
from("activemq:My.Queue").
  to("freemarker:com/acme/MyResponse.ftl");
Copy to Clipboard Toggle word wrap
FreeMarker テンプレートを使用して InOut メッセージエクスチェンジへの応答( JMSReplyTo ヘッダーがある場所)を形成するには、以下を実行します。
InOnly エクスチェンジを処理する場合は、FreeMarker テンプレートを使用してメッセージを別のエンドポイントに送信する前に変換できます。
from("activemq:My.Queue").
  to(ExchangePattern.InOut,"freemarker:com/acme/MyResponse.ftl").
  to("activemq:Another.Queue");
Copy to Clipboard Toggle word wrap
また、コンテンツキャッシュを無効にするには(たとえば、.ftl テンプレートをホットリロードする必要がある開発使用の場合):
from("activemq:My.Queue").
  to(ExchangePattern.InOut,"freemarker:com/acme/MyResponse.ftl?contentCache=false").
  to("activemq:Another.Queue");
Copy to Clipboard Toggle word wrap
ファイルベースのリソースの場合:
from("activemq:My.Queue").
  to(ExchangePattern.InOut,"freemarker:file://myfolder/MyResponse.ftl?contentCache=false").
  to("activemq:Another.Queue");
Copy to Clipboard Toggle word wrap
Camel 2.1 では、以下のように、コンポーネントがヘッダーを介して動的に使用するテンプレートを指定できます。
from("direct:in").
  setHeader(FreemarkerConstants.FREEMARKER_RESOURCE_URI).constant("path/to/my/template.ftl").
  to("freemarker:dummy?allowTemplateFromHeader=true");
Copy to Clipboard Toggle word wrap
警告
allowTemplateFromHeader オプションを有効にすると、セキュリティーの問題があります。たとえば、ヘッダーに信頼できないコンテンツまたはユーザー派生コンテンツが含まれる場合、これは最終的に、エンドアプリケーションの確実性と整合性に及ぼす可能性があるため、このオプションを使用してください。

電子メールのサンプル

この例では、FreeMarker テンプレートを使用し、注文確認メールを使用します。メールテンプレートは、以下のように FreeMarker に記載されています。
Dear ${headers.lastName}, ${headers.firstName}

Thanks for the order of ${headers.item}.

Regards Camel Riders Bookstore
${body}
Copy to Clipboard Toggle word wrap
Java コード:
private Exchange createLetter() {
    Exchange exchange = context.getEndpoint("direct:a").createExchange();
    Message msg = exchange.getIn();
    msg.setHeader("firstName", "Claus");
    msg.setHeader("lastName", "Ibsen");
    msg.setHeader("item", "Camel in Action");
    msg.setBody("PS: Next beer is on me, James");
    return exchange;
}

@Test
public void testFreemarkerLetter() throws Exception {
    MockEndpoint mock = getMockEndpoint("mock:result");
    mock.expectedMessageCount(1);
    mock.expectedBodiesReceived("Dear Ibsen, Claus\n\nThanks for the order of Camel in Action."
      + "\n\nRegards Camel Riders Bookstore\nPS: Next beer is on me, James");

    template.send("direct:a", createLetter());

    mock.assertIsSatisfied();
}

protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        public void configure() throws Exception {
            from("direct:a")
                .to("freemarker:org/apache/camel/component/freemarker/letter.ftl")
                .to("mock:result");
        }
    };
}
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat