camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Camel > Parameter Binding Annotations
Date Fri, 27 May 2011 01:14:00 GMT
<html>
<head>
    <base href="https://cwiki.apache.org/confluence">
            <link rel="stylesheet" href="/confluence/s/2042/9/1/_/styles/combined.css?spaceKey=CAMEL&amp;forWysiwyg=true"
type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://cwiki.apache.org/confluence/display/CAMEL/Parameter+Binding+Annotations">Parameter
Binding Annotations</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://cwiki.apache.org/confluence/display/~njiang">willem
jiang</a>
    </h4>
        <div id="versionComment">
        <b>Comment:</b>
        CAMEL-1378 <br />
    </div>
        <br/>
                         <h4>Changes (4)</h4>
                                 
    
<div id="page-diffs">
                    <table class="diff" cellpadding="0" cellspacing="0">
    
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >The follow annotations {{@Headers}},
{{@OutHeaders}} and {{@Properties}} binds to the backing {{java.util.Map}} so you can alter
the content of these maps directly, for instance using the {{put}} method to add a new entry.
See the OrderService class at [Exception Clause] for such an example. <br> <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">Since
*Camel 2.0*, you can use {{@Header(&quot;myHeader&quot;)}} and {{@Property(&quot;myProperty&quot;)}}
instead of {{@Header(name=&quot;myHeader&quot;)}} and {{@Property(name=&quot;myProperty&quot;)}}
as *Camel 1.x* does.  <br></td></tr>
            <tr><td class="diff-unchanged" >h3. Example <br>In this example
below we have a @Consume consumer (like message driven) that consumes JMS messages from the
activemq queue. We use the @Header and @Body parameter binding annotations to bind from the
JMSMessage to the method parameters. <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" > <br>    @Consume(uri = &quot;activemq:my.queue&quot;)
<br></td></tr>
            <tr><td class="diff-changed-lines" >public void <span class="diff-changed-words">doSomething(@Header(<span
class="diff-deleted-chars"style="color:#999;background-color:#fdd;text-decoration:line-through;">name
= </span>&quot;JMSCorrelationID&quot;)</span> String correlationID, @Body
String body) { <br></td></tr>
            <tr><td class="diff-unchanged" >		// process the inbound message here
<br>    } <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >{code} <br>public class Foo
{ <br></td></tr>
            <tr><td class="diff-changed-lines" >public void <span class="diff-changed-words">doSomething(@Header(<span
class="diff-deleted-chars"style="color:#999;background-color:#fdd;text-decoration:line-through;">name
= </span>&quot;JMSCorrelationID&quot;)</span> String correlationID, @Body
String body) { <br></td></tr>
            <tr><td class="diff-unchanged" >		// process the inbound message here
<br>    } <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >And here we have a nifty example for
you to show some great power in Camel. You can mix and match the annotations with the normal
parameters, so we can have this example with annotations and the Exchange also: <br>{code}
<br></td></tr>
            <tr><td class="diff-changed-lines" >public void <span class="diff-changed-words">doSomething(@Header(<span
class="diff-deleted-chars"style="color:#999;background-color:#fdd;text-decoration:line-through;">name
= </span>&quot;user&quot;)</span> String user, @Body String body, Exchange
exchange) { <br></td></tr>
            <tr><td class="diff-unchanged" >        exchange.getIn().setBody(body
+ &quot;MyBean&quot;); <br>    } <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
    
            </table>
    </div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        <h3><a name="ParameterBindingAnnotations-ParameterBindingAnnotations"></a>Parameter
Binding Annotations</h3>

<div class='panelMacro'><table class='infoMacro'><colgroup><col width='24'><col></colgroup><tr><td
valign='top'><img src="/confluence/images/icons/emoticons/information.gif" width="16"
height="16" align="absmiddle" alt="" border="0"></td><td><b>camel-core</b><br
/>The annotations below are all part of <b>camel-core</b> and thus does not
require <b>camel-spring</b> or <a href="/confluence/display/CAMEL/Spring" title="Spring">Spring</a>.
These annotations can be used with the <a href="/confluence/display/CAMEL/Bean" title="Bean">Bean</a>
component or when invoking beans in the <a href="/confluence/display/CAMEL/DSL" title="DSL">DSL</a></td></tr></table></div>

<p>Annotations can be used to define an <a href="/confluence/display/CAMEL/Expression"
title="Expression">Expression</a> or to extract various headers, properties or payloads
from a <a href="/confluence/display/CAMEL/Message" title="Message">Message</a>
when invoking a bean method (see <a href="/confluence/display/CAMEL/Bean+Integration" title="Bean
Integration">Bean Integration</a> for more detail of how to invoke bean methods)
together with being useful to help disambiguate which method to invoke.</p>

<p>If no annotations are used then Camel assumes that a single parameter is the body
of the message. Camel will then use the <a href="/confluence/display/CAMEL/Type+Converter"
title="Type Converter">Type Converter</a> mechanism to convert from the expression
value to the actual type of the parameter.</p>

<p>The core annotations are as follows</p>

<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Annotation </th>
<th class='confluenceTh'> Meaning </th>
<th class='confluenceTh'> Parameter </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Body.html"
class="external-link" rel="nofollow">@Body</a> </td>
<td class='confluenceTd'> To bind to an inbound message body </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/ExchangeException.html"
class="external-link" rel="nofollow">@ExchangeException</a> </td>
<td class='confluenceTd'> To bind to an Exception set on the exchange (<b>Camel
2.0</b>) </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Header.html"
class="external-link" rel="nofollow">@Header</a> </td>
<td class='confluenceTd'> To bind to an inbound message header </td>
<td class='confluenceTd'> String name of the header </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Headers.html"
class="external-link" rel="nofollow">@Headers</a> </td>
<td class='confluenceTd'> To bind to the Map of the inbound message headers </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/OutHeaders.html"
class="external-link" rel="nofollow">@OutHeaders</a> </td>
<td class='confluenceTd'> To bind to the Map of the outbound message headers </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Property.html"
class="external-link" rel="nofollow">@Property</a> </td>
<td class='confluenceTd'> To bind to a named property on the exchange </td>
<td class='confluenceTd'> String name of the property </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Properties.html"
class="external-link" rel="nofollow">@Properties</a> </td>
<td class='confluenceTd'> To bind to the property map on the exchange </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> @Handler </td>
<td class='confluenceTd'> <b>Camel 2.0:</b> Not part as a type parameter
but stated in this table anyway to spread the good word that we have this annotation in Camel
now. See more at <a href="/confluence/display/CAMEL/Bean+Binding" title="Bean Binding">Bean
Binding</a>. </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
</tbody></table>
</div>


<p>The follow annotations <tt>@Headers</tt>, <tt>@OutHeaders</tt>
and <tt>@Properties</tt> binds to the backing <tt>java.util.Map</tt>
so you can alter the content of these maps directly, for instance using the <tt>put</tt>
method to add a new entry. See the OrderService class at <a href="/confluence/display/CAMEL/Exception+Clause"
title="Exception Clause">Exception Clause</a> for such an example.</p>

<p>Since <b>Camel 2.0</b>, you can use <tt>@Header("myHeader")</tt>
and <tt>@Property("myProperty")</tt> instead of <tt>@Header(name="myHeader")</tt>
and <tt>@Property(name="myProperty")</tt> as <b>Camel 1.x</b> does.
</p>
<h3><a name="ParameterBindingAnnotations-Example"></a>Example</h3>
<p>In this example below we have a @Consume consumer (like message driven) that consumes
JMS messages from the activemq queue. We use the @Header and @Body parameter binding annotations
to bind from the JMSMessage to the method parameters.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
<span class="code-keyword">public</span> class Foo {
	
    @Consume(uri = <span class="code-quote">"activemq:my.queue"</span>)
    <span class="code-keyword">public</span> void doSomething(@Header(<span
class="code-quote">"JMSCorrelationID"</span>) <span class="code-object">String</span>
correlationID, @Body <span class="code-object">String</span> body) {
		<span class="code-comment">// process the inbound message here
</span>    }

}
</pre>
</div></div>

<p>In the above Camel will extract the value of Message.getJMSCorrelationID(), then
using the <a href="/confluence/display/CAMEL/Type+Converter" title="Type Converter">Type
Converter</a> to adapt the value to the type of the parameter if required - it will
inject the parameter value for the <b>correlationID</b> parameter. Then the payload
of the message will be converted to a String and injected into the <b>body</b>
parameter.</p>

<p>You don't need to use the @Consume annotation; as you could use the Camel <a href="/confluence/display/CAMEL/DSL"
title="DSL">DSL</a> to route to the beans method</p>

<h4><a name="ParameterBindingAnnotations-UsingtheDSLtoinvokethebeanmethod"></a>Using
the DSL to invoke the bean method</h4>

<p>Here is another example which does not use <a href="/confluence/display/CAMEL/POJO+Consuming"
title="POJO Consuming">POJO Consuming</a> annotations but instead uses the <a
href="/confluence/display/CAMEL/DSL" title="DSL">DSL</a> to route messages to the
bean method</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
<span class="code-keyword">public</span> class Foo {
    <span class="code-keyword">public</span> void doSomething(@Header(<span
class="code-quote">"JMSCorrelationID"</span>) <span class="code-object">String</span>
correlationID, @Body <span class="code-object">String</span> body) {
		<span class="code-comment">// process the inbound message here
</span>    }

}
</pre>
</div></div>

<p>The routing DSL then looks like this</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
from(<span class="code-quote">"activemq:someQueue"</span>).
  to(<span class="code-quote">"bean:myBean"</span>);
</pre>
</div></div>

<p>Here <b>myBean</b> would be looked up in the <a href="/confluence/display/CAMEL/Registry"
title="Registry">Registry</a> (such as JNDI or the Spring ApplicationContext), then
the body of the message would be used to try figure out what method to call.</p>

<p>If you want to be explicit you can use</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
from(<span class="code-quote">"activemq:someQueue"</span>).
  to(<span class="code-quote">"bean:myBean?methodName=doSomething"</span>);
</pre>
</div></div>

<p>And here we have a nifty example for you to show some great power in Camel. You can
mix and match the annotations with the normal parameters, so we can have this example with
annotations and the Exchange also:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
    <span class="code-keyword">public</span> void doSomething(@Header(<span
class="code-quote">"user"</span>) <span class="code-object">String</span>
user, @Body <span class="code-object">String</span> body, Exchange exchange) {
        exchange.getIn().setBody(body + <span class="code-quote">"MyBean"</span>);
    }
</pre>
</div></div>

<h3><a name="ParameterBindingAnnotations-AnnotationBasedExpressionLanguage"></a>Annotation
Based Expression Language</h3>

<p>You can also use any of the <a href="/confluence/display/CAMEL/Languages" title="Languages">Languages</a>
supported in Camel to bind expressions to method parameters when using <a href="/confluence/display/CAMEL/Bean+Integration"
title="Bean Integration">Bean Integration</a>. For example you can use any of these
annotations:</p>

<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'>Annotation</th>
<th class='confluenceTh'>Description</th>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/language/Bean.html"
class="external-link" rel="nofollow">@Bean</a> </td>
<td class='confluenceTd'> Inject a <a href="/confluence/display/CAMEL/Bean" title="Bean">Bean</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-script/apidocs/org/apache/camel/builder/script/BeanShell.html"
class="external-link" rel="nofollow">@BeanShell</a> </td>
<td class='confluenceTd'> Inject a <a href="/confluence/display/CAMEL/BeanShell"
title="BeanShell">BeanShell</a> expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/language/Constant.html"
class="external-link" rel="nofollow">@Constant</a> </td>
<td class='confluenceTd'> Inject a <a href="/confluence/display/CAMEL/Constant" title="Constant">Constant</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-juel/apidocs/org/apache/camel/language/juel/EL.html"
class="external-link" rel="nofollow">@EL</a> </td>
<td class='confluenceTd'> Inject an <a href="/confluence/display/CAMEL/EL" title="EL">EL</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-script/apidocs/org/apache/camel/builder/script/Groovy.html"
class="external-link" rel="nofollow">@Groovy</a> </td>
<td class='confluenceTd'> Inject a <a href="/confluence/display/CAMEL/Groovy" title="Groovy">Groovy</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/maven/camel-core/apidocs/org/apache/camel/Header.html"
class="external-link" rel="nofollow">@Header</a> </td>
<td class='confluenceTd'> Inject a <a href="/confluence/display/CAMEL/Header" title="Header">Header</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-script/apidocs/org/apache/camel/builder/script/JavaScript.html"
class="external-link" rel="nofollow">@JavaScript</a> </td>
<td class='confluenceTd'> Inject a <a href="/confluence/display/CAMEL/JavaScript"
title="JavaScript">JavaScript</a> expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-mvel/apidocs/org/apache/camel/language/mvel/MVEL.html"
class="external-link" rel="nofollow">@MVEL</a> </td>
<td class='confluenceTd'> Inject a <a href="/confluence/display/CAMEL/Mvel" title="Mvel">Mvel</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-ognl/apidocs/org/apache/camel/language/ognl/OGNL.html"
class="external-link" rel="nofollow">@OGNL</a> </td>
<td class='confluenceTd'> Inject an <a href="/confluence/display/CAMEL/OGNL" title="OGNL">OGNL</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-script/apidocs/org/apache/camel/builder/script/PHP.html"
class="external-link" rel="nofollow">@PHP</a> </td>
<td class='confluenceTd'> Inject a <a href="/confluence/display/CAMEL/PHP" title="PHP">PHP</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-script/apidocs/org/apache/camel/builder/script/Python.html"
class="external-link" rel="nofollow">@Python</a> </td>
<td class='confluenceTd'> Inject a <a href="/confluence/display/CAMEL/Python" title="Python">Python</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-script/apidocs/org/apache/camel/builder/script/Ruby.html"
class="external-link" rel="nofollow">@Ruby</a> </td>
<td class='confluenceTd'> Inject a <a href="/confluence/display/CAMEL/Ruby" title="Ruby">Ruby</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/language/Simple.html"
class="external-link" rel="nofollow">@Simple</a> </td>
<td class='confluenceTd'> Inject an <a href="/confluence/display/CAMEL/Simple" title="Simple">Simple</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/language/XPath.html"
class="external-link" rel="nofollow">@XPath</a> </td>
<td class='confluenceTd'> Inject an <a href="/confluence/display/CAMEL/XPath" title="XPath">XPath</a>
expression </td>
</tr>
<tr>
<td class='confluenceTd'><a href="http://camel.apache.org/maven/current/camel-saxon/apidocs/org/apache/camel/component/xquery/XQuery.html"
class="external-link" rel="nofollow">@XQuery</a> </td>
<td class='confluenceTd'> Inject an <a href="/confluence/display/CAMEL/XQuery" title="XQuery">XQuery</a>
expression </td>
</tr>
</tbody></table>
</div>


<h4><a name="ParameterBindingAnnotations-Example%3A"></a>Example:</h4>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
<span class="code-keyword">public</span> class Foo {
	
    @MessageDriven(uri = <span class="code-quote">"activemq:my.queue"</span>)
    <span class="code-keyword">public</span> void doSomething(@XPath(<span
class="code-quote">"/foo/bar/text()"</span>) <span class="code-object">String</span>
correlationID, @Body <span class="code-object">String</span> body) {
		<span class="code-comment">// process the inbound message here
</span>    }
}
</pre>
</div></div>

<h4><a name="ParameterBindingAnnotations-Advancedexampleusing@Bean"></a>Advanced
example using @Bean</h4>

<p>And an example of using the the <a href="http://activemq.apache.org/camel/maven/camel-core/apidocs/org/apache/camel/language/Bean.html"
class="external-link" rel="nofollow">@Bean</a> binding annotation, where you can
use a <a href="/confluence/display/CAMEL/Pojo" title="Pojo">Pojo</a> where you
can do whatever java code you like:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
<span class="code-keyword">public</span> class Foo {
	
    @MessageDriven(uri = <span class="code-quote">"activemq:my.queue"</span>)
    <span class="code-keyword">public</span> void doSomething(@Bean(<span class="code-quote">"myCorrelationIdGenerator"</span>)
<span class="code-object">String</span> correlationID, @Body <span class="code-object">String</span>
body) {
		<span class="code-comment">// process the inbound message here
</span>    }
}
</pre>
</div></div>

<p>And then we can have a spring bean with the id <b>myCorrelationIdGenerator</b>
where we can compute the id.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
<span class="code-keyword">public</span> class MyIdGenerator {

    <span class="code-keyword">private</span> UserManager userManager;

    <span class="code-keyword">public</span> <span class="code-object">String</span>
generate(@Header(name = <span class="code-quote">"user"</span>) <span class="code-object">String</span>
user, @Body <span class="code-object">String</span> payload) <span class="code-keyword">throws</span>
Exception {
       User user = userManager.lookupUser(user);
       <span class="code-object">String</span> userId = user.getPrimaryId();
       <span class="code-object">String</span> id = userId + generateHashCodeForPayload(payload);
       <span class="code-keyword">return</span> id;
   }
}
</pre>
</div></div>

<p>The <a href="/confluence/display/CAMEL/Pojo" title="Pojo">Pojo</a> MyIdGenerator
has one public method that accepts two parameters. However we have also annotated this one
with the @Header and @Body annotation to help Camel know what to bind here from the Message
from the Exchange being processed.</p>

<p>Of course this could be simplified a lot if you for instance just have a simple id
generator. But we wanted to demonstrate that you can use the <a href="/confluence/display/CAMEL/Bean+Binding"
title="Bean Binding">Bean Binding</a> annotations anywhere.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
<span class="code-keyword">public</span> class MySimpleIdGenerator {

    <span class="code-keyword">public</span> <span class="code-keyword">static</span>
<span class="code-object">int</span> generate()  {
       <span class="code-comment">// generate a unique id
</span>       <span class="code-keyword">return</span> 123;
   }
}
</pre>
</div></div>

<p>And finally we just need to remember to have our bean registered in the Spring <a
href="/confluence/display/CAMEL/Registry" title="Registry">Registry</a>:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">
   <span class="code-tag">&lt;bean id=<span class="code-quote">"myCorrelationIdGenerator"</span>
class=<span class="code-quote">"com.mycompany.MySimpleIdGenerator"</span>/&gt;</span>
</pre>
</div></div>

<h4><a name="ParameterBindingAnnotations-ExampleusingGroovy"></a>Example
using <a href="/confluence/display/CAMEL/Groovy" title="Groovy">Groovy</a></h4>
<p>In this example we have an Exchange that has a User object stored in the in header.
This User object has methods to get some user information. We want to use <a href="/confluence/display/CAMEL/Groovy"
title="Groovy">Groovy</a> to inject an expression that extracts and concats the fullname
of the user into the fullName parameter.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
    <span class="code-keyword">public</span> void doSomething(@Groovy("$request.header['user'].firstName
$request.header['user'].familyName) <span class="code-object">String</span> fullName,
@Body <span class="code-object">String</span> body) {
		<span class="code-comment">// process the inbound message here
</span>    }
</pre>
</div></div>

<p>Groovy supports GStrings that is like a template where we can insert $ placeholders
that will be evaluated by Groovy.</p>
    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;">
            <a href="https://cwiki.apache.org/confluence/users/viewnotifications.action"
class="grey">Change Notification Preferences</a>
        </div>
        <a href="https://cwiki.apache.org/confluence/display/CAMEL/Parameter+Binding+Annotations">View
Online</a>
        |
        <a href="https://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=98520&revisedVersion=20&originalVersion=19">View
Changes</a>
                |
        <a href="https://cwiki.apache.org/confluence/display/CAMEL/Parameter+Binding+Annotations?showComments=true&amp;showCommentArea=true#addcomment">Add
Comment</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>

Mime
View raw message