キャメルベロシティテンプレート - Javaオブジェクトのプロパティへのアクセス -- apache-camel フィールド と velocity フィールド 関連 問題

Camel Velocity Template - access java object properties












1
vote

問題

日本語

私はベロシティテンプレートを使用し、ボディでは、次のように定義されたオブジェクトを持っています。

<事前> <コード> class MailImpl extends AbstractMail{ private BodyContext bodyContext; public BodyContext getBodyContext() { return bodyContext; } public void setBodyContext(BodyContext bodyContext) { this.bodyContext = bodyContext; } private String test; public String getTest() { return test; } public void setTest(String test) { this.test = test; } @Override public String toString() { return "MailImpl{" + "bodyContext=" + bodyContext + '}'; } } class BodyContext{ private String value; public BodyContext(String value) { this.value = value; } public BodyContext() { } public String getValue() { return value; } public void setValue(String value) { this.value = value; } @Override public String toString() { return "BodyContext{" + "value='" + value + ''' + '}'; }

Velocityテンプレートでは、MailImplオブジェクトのプロパティにアクセスします。たとえば、$ {body.test}と$ {body.bodyContext.value}を使用しますが、Velocityテンプレートはそれらの値を変換しません(文字列$として返されます。 {body.test}と$ {body.bodyContext.value})。

1つのソリューションは、テンプレートで使用する必要がある値のそれぞれごとにヘッダーを作成する可能性がありますが、私のルートが動的であるため(私はヘッダーに基づいてベロシティテンプレートを選択します)私はベロシティコンテキストの本文のプロパティにアクセスしたいです。 。これはどういうわけか可能ですか?

英語

I have a camel route which uses Velocity template and in the body I have an object defined as following:

class MailImpl extends AbstractMail{      private BodyContext bodyContext;      public BodyContext getBodyContext() {         return bodyContext;     }      public void setBodyContext(BodyContext bodyContext) {         this.bodyContext = bodyContext;     }      private String test;      public String getTest() {         return test;     }      public void setTest(String test) {         this.test = test;     }      @Override     public String toString() {         return "MailImpl{" +                 "bodyContext=" + bodyContext +                 '}';     } }  class BodyContext{     private String value;      public BodyContext(String value) {         this.value = value;     }      public BodyContext() {     }      public String getValue() {         return value;     }      public void setValue(String value) {         this.value = value;     }      @Override     public String toString() {         return "BodyContext{" +                 "value='" + value + ''' +                 '}';     } 

In the velocity template I would like to access the MailImpl object properties, for example I use ${body.test} and ${body.bodyContext.value} but velocity template does not transform those values (it returns as string ${body.test} and ${body.bodyContext.value}).

One solution could be creating headers for each of of the value I need to use in the template, but as my route is dynamic (I select velocity template based on header) I would like to access the body properties in the velocity context. Is this somehow possible?

</div
     

回答リスト

3
 
vote
vote
ベストアンサー
 

Message Header "CamelVelocityContext" を設定することで、カスタムベロシティコンテキストを設定できます(キャメルV2.14)。 Camel's テストケース:

<事前> <コード> 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); VelocityContext velocityContext = new VelocityContext(variableMap); exchange.getIn().setHeader(VelocityConstants.VELOCITY_CONTEXT, velocityContext); exchange.setProperty("item", "7");

以下のテンプレートで:

<事前> <コード> Dear ${headers.name}. You ordered item ${exchange.properties.item} on ${body}.

あなたは取得します:

<事前> <コード> Dear Willem. You ordered item 7 on Monday.
 

You can setup a custom Velocity Context by setting the message header "CamelVelocityContext" (since Camel v2.14). From Camel's test case:

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); VelocityContext velocityContext = new VelocityContext(variableMap); exchange.getIn().setHeader(VelocityConstants.VELOCITY_CONTEXT, velocityContext); exchange.setProperty("item", "7"); 

With following template:

Dear ${headers.name}. You ordered item ${exchange.properties.item} on ${body}. 

You get:

Dear Willem. You ordered item 7 on Monday. 
</div
 
 

関連する質問

2  あるベロシティコンテンツを別のベロシティテンプレートに呼び出します  ( Call one velocity content to another velocity template ) 
コードを再利用するために別のテンプレートに1つのベロシティテンプレートを呼び出すことができますか? たとえば、共通コードがあるベロシティテンプレートと、他のベロシティテンプレートで使用したいその一般的なコードがあるベロシティテンプレートを持っています。 提案し...

0  Velocity:テンプレートからメソッドを非表示にします  ( Velocity hide methods from template ) 
パブリックメソッドを「ベロシティテンプレートから呼び出すことはできません」とマークする方法はあります。 ...

1  Velocity XPath式で変数を使用する方法  ( How to use variables in velocity xpath expressions ) 
<コード> rollnumber[1] に定数 "1"を指定した場合 <事前> <コード> /root/person/rollnumber[1] XPathは大丈夫です。 しかし定数の代わりに、私はいくつかの変数を提供したいです。 <事前> <コード...

26  Velocityテンプレートで 'for'ループを使用する方法  ( How to use for loop in velocity template ) 
「ループ」のためにちょうどグーグルされたが、速度の唯一の唯一の唯一の唯一のものがあるように見える。 ベロシティテンプレートで 'Loop' for Loop 'を使うのですか? ...

0  アプリが製造に展開されているときのベロシティテンプレートでのエンコードの問題  ( Encoding issue in velocity template when the app is deployed in production ) 
Velocityテンプレートを使用して、ユーザーに電子メールを送信します。これらの電子メールは、 's、ñまたは'などの要素を持っています。ローカルに電子メールを送信するときは、すべてがうまく機能し、そのままの問題はありません。 「アプリ」が展開環境にある...

6  未定義$変数で失敗するようにベロシティを設定します  ( Configure velocity to fail on undefined variable ) 
$ varが未定義のときに失敗するように設定され(すなわち、例外をスローさせることができます。 そのような「故障速い」戦略は私たちのテストサイクルに役立ちます。 ...

1  文字列をベロシティのマップに変換する方法  ( How to convert a string to a map in velocity ) 
私は何かがあります: <事前> <コード> set( $userPrefs = ${subscription.getUserPreferences()} ) getUserPreferences() は、実際にエスケープされているJSON値である文字列...

15  Apache Velocityテンプレートから定数値へのアクセス?  ( Accessing constant values from an apache velocity template ) 
ベロシティテンプレートから定数値(すなわち、Javaクラスで定義されているパブリックスタティック最終変数)にアクセスすることは可能ですか? このようなものを書くことができるようにしたい: <事前> <コード> #if ($a lt Long.MAX_VALUE...

70  ベロシティ対フリーマーカー[クローズ]  ( Velocity vs freemarker ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...

3  Spring MVC + Hibernate Validator + Velocity  ( Spring mvc hibernate validator velocity ) 
Spring MVCを使用して基本的な検証を取得できないようです。 次のPOJOを持っています: <事前> <コード> public class Example { @NotNull(message="You must enter a value"...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有