Fuse 6 is no longer supported
As of February 2025, Red Hat Fuse 6 is no longer supported. If you are using Fuse 6, please upgrade to Red Hat build of Apache Camel.第52章 FreeMarker
FreeMarker リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
freemarker: コンポーネントを使用すると、FreeMarker テンプレートを使用してメッセージを処理できます。これは、Templating を使用してリクエストの応答を生成する場合に理想的です。
Maven ユーザーは、このコンポーネントの
pom.xml
に以下の依存関係を追加する必要があります。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
freemarker:templateName[?options]
freemarker:templateName[?options]
templateName は、呼び出すテンプレートのクラスパスローカル URI、またはリモートテンプレートの完全な URL (例:
file://folder/myfile.ftl
)に置き換えます。
URI にクエリーオプションは
?option=value&option=value&.. の形式で追加できます。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
オプション | デフォルト | 説明 |
---|---|---|
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
は以下のように転送されます。
キー | 値 |
---|---|
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);
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);
ホットリロード リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
FreeMarker テンプレートリソースは、デフォルトでは、ファイルとクラスパスリソース(展開形式の jar)の両方でホットリロードでき ません。
contentCache=false
を設定すると、Apache Camel はリソースをキャッシュせず、ホットリロードが有効になります。このシナリオは開発中に使用できます。
動的テンプレート リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2 .1 Camel では利用可能な 2 つの ヘッダーで、テンプレートまたはテンプレートコンテンツ自体の異なるリソースの場所を定義できます。これらのヘッダーのいずれかが設定されている場合、Camel は設定されたエンドポイントでこれを使用します。これにより、ランタイム時に動的テンプレートを指定できます。
ヘッダー | タイプ | 説明 | サポートバージョン |
---|---|---|---|
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");
from("activemq:My.Queue").
to("freemarker:com/acme/MyResponse.ftl");
FreeMarker テンプレートを使用して InOut メッセージエクスチェンジへの応答(
JMSReplyTo
ヘッダーがある場所)を形成するには、以下を実行します。
InOnly エクスチェンジを処理する場合は、FreeMarker テンプレートを使用してメッセージを別のエンドポイントに送信する前に変換できます。
from("activemq:My.Queue"). to(ExchangePattern.InOut,"freemarker:com/acme/MyResponse.ftl"). to("activemq:Another.Queue");
from("activemq:My.Queue").
to(ExchangePattern.InOut,"freemarker:com/acme/MyResponse.ftl").
to("activemq:Another.Queue");
また、コンテンツキャッシュを無効にするには(たとえば、
.ftl
テンプレートをホットリロードする必要がある開発使用の場合):
from("activemq:My.Queue"). to(ExchangePattern.InOut,"freemarker:com/acme/MyResponse.ftl?contentCache=false"). to("activemq:Another.Queue");
from("activemq:My.Queue").
to(ExchangePattern.InOut,"freemarker:com/acme/MyResponse.ftl?contentCache=false").
to("activemq:Another.Queue");
ファイルベースのリソースの場合:
from("activemq:My.Queue"). to(ExchangePattern.InOut,"freemarker:file://myfolder/MyResponse.ftl?contentCache=false"). to("activemq:Another.Queue");
from("activemq:My.Queue").
to(ExchangePattern.InOut,"freemarker:file://myfolder/MyResponse.ftl?contentCache=false").
to("activemq:Another.Queue");
Camel 2.1 では、以下のように、コンポーネントがヘッダーを介して動的に使用するテンプレートを指定できます。
from("direct:in"). setHeader(FreemarkerConstants.FREEMARKER_RESOURCE_URI).constant("path/to/my/template.ftl"). to("freemarker:dummy?allowTemplateFromHeader=true");
from("direct:in").
setHeader(FreemarkerConstants.FREEMARKER_RESOURCE_URI).constant("path/to/my/template.ftl").
to("freemarker:dummy?allowTemplateFromHeader=true");
警告
allowTemplateFromHeader
オプションを有効にすると、セキュリティーの問題があります。たとえば、ヘッダーに信頼できないコンテンツまたはユーザー派生コンテンツが含まれる場合、これは最終的に、エンドアプリケーションの確実性と整合性に及ぼす可能性があるため、このオプションを使用してください。
電子メールのサンプル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
この例では、FreeMarker テンプレートを使用し、注文確認メールを使用します。メールテンプレートは、以下のように FreeMarker に記載されています。
Java コード: