第171章 StringTemplate
string Template リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
string-template: コンポーネントを使用すると、String Template を使用してメッセージを処理できます。これは、Templating を使用してリクエストの応答を生成する場合に理想的です。
Maven ユーザーは、このコンポーネントの
pom.xml に以下の依存関係を追加する必要があります。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-stringtemplate</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
string-template:templateName[?options]
templateName は、呼び出すテンプレートのクラスパスローカル URI、またはリモートテンプレートの完全な URL です。
URI にクエリーオプションは
?option=value&option=value&.. の形式で追加できます。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| オプション | デフォルト | 説明 |
|---|---|---|
allowContextMapAll (producer)
|
false
|
コンテキストマップが前詳細へのアクセスを許可するかどうかを設定します。デフォルトでは、メッセージの本文とヘッダーにのみアクセスできます。このオプションは、現在の Exchange および CamelContext へのフルアクセスに対して有効にできます。これを行うと、CamelContext API の全機能へのアクセスが開かれるため、潜在的なセキュリティーリスクが発生します。
|
allowTemplateFromHeader (producer)
|
false
|
ヘッダーのリソーステンプレートの使用を許可するかどうか (デフォルトは false)。このオプションを有効にすると、セキュリティーの問題があります。たとえば、ヘッダーに信頼されていないコンテンツやユーザー派生コンテンツが含まれている場合、これは最終的にエンドアプリケーションの信頼性および完全性に影響を与える可能性があるため、このオプションは注意して使用してください。
|
contentCache
|
false
|
読み込み時のリソースコンテンツのキャッシュ。注記: Camel 2.9 でキャッシュされたリソースコンテンツは、エンドポイントの clearContentCache 操作を使用して JMX 経由でクリアできます。
|
delimiterStart
|
null
|
Camel 2.11.1 以降、変数開始区切り文字の設定 |
delimiterStop
|
null
|
Camel 2.11.1 以降、変数終了区切り文字の設定 |
Headers リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Apache Camel は、キー
org.apache.camel.stringtemplate.resource を持つメッセージヘッダーのリソースへの参照を保存します。リソースは org.springframework.core.io.Resource オブジェクトです。
ホットリロード リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
文字列テンプレートリソースは、デフォルトではファイルとクラスパスリソース(展開形式の jar)の両方に対してホットリロードが可能です。
contentCache=true を設定すると、Apache Camel はリソースを 1 度だけ読み込み、ホットリロードができません。このシナリオは、リソースが変更されない場合に実稼働で使用できます。
stringtemplate 属性 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Apache Camel は、エクスチェンジ情報を属性(
java.util.Mapのみ)として文字列テンプレートに提供します。Exchange は以下のように転送されます。
| key | value |
|---|---|
exchange
|
エクスチェンジ自体。 |
ヘッダー
|
In メッセージのヘッダー。 |
camelContext
|
Camel コンテキスト。 |
request
|
In メッセージ。 |
in
|
In メッセージ。 |
ボディー
|
In メッセージのボディー。 |
out
|
Out メッセージ(InOut メッセージ交換パターンにのみ有効)。 |
response
|
Out メッセージ(InOut メッセージ交換パターンにのみ有効)。 |
Camel 2.14 以降、以下のコードと同様に、メッセージヘッダーCamelStringTemplateVariableMapを設定してカスタムコンテキストマップを定義できます。
Map<String, Object> variableMap = new HashMap<String, Object>();
Map<String, Object> headersMap = new HashMap<String, Object>();
headersMap.put("name", "Willem");
variableMap.put("headers", headersMap);
variableMap.put("body", "Monday");
variableMap.put("exchange", exchange);
exchange.getIn().setHeader("CamelStringTemplateVariableMap", variableMap);
サンプル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
たとえば、メッセージへの応答を形成するために、以下のように文字列テンプレートを使用できます。
from("activemq:My.Queue").
to("string-template:com/acme/MyResponse.tm");
電子メールのサンプル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
この例では、文字列テンプレートを使用して注文確認メールを送信します。メールテンプレートは
StringTemplate にそのまま配置されます。この例では camel 2.11.0 で機能します。Camel バージョンが 2.11.0 未満の場合は、変数を起動して $ で終了する必要があります。
Dear <headers.lastName>, <headers.firstName>
Thanks for the order of <headers.item>.
Regards Camel Riders Bookstore
<body>
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 testVelocityLetter() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedMessageCount(1);
mock.expectedBodiesReceived("Dear Ibsen, Claus! Thanks for the order of Camel in Action. Regards Camel Riders Bookstore PS: 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("string-template:org/apache/camel/component/stringtemplate/letter.tm").to("mock:result");
}
};
}