camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Romain Manni-Bucau <>
Subject Re: bean, ejb etc... how to set parameters
Date Sun, 08 May 2011 20:27:38 GMT
i did a poc,

i need a modification in camel-core, here is the diff:

Index: src/main/java/org/apache/camel/component/bean/
--- src/main/java/org/apache/camel/component/bean/ (révision
+++ src/main/java/org/apache/camel/component/bean/ (copie de
@@ -289,7 +289,7 @@
    protected MethodInfo createMethodInfo(Class clazz, Method method) {
         Class[] parameterTypes = method.getParameterTypes();
-        Annotation[][] parametersAnnotations =
+        Annotation[][] parametersAnnotations = getAnnotationsFor(method);

        List<ParameterInfo> parameters = new ArrayList<ParameterInfo>();
         List<ParameterInfo> bodyParameters = new
@@ -338,6 +338,10 @@
         return new MethodInfo(camelContext, clazz, method, parameters,
bodyParameters, hasCustomAnnotation, hasHandlerAnnotation);

+    protected Annotation[][] getAnnotationsFor(Method method) {
+        return method.getParameterAnnotations();
+    }
     * Lets try choose one of the available methods to invoke if we can
      * the message body to the body parameter

It is simply adding getAnnotationsFor(Method method) method to allow me to
override it in a child class.

After this modification i did a component reading a file containing the
annotation description:

<?xml version="1.0" encoding="UTF-8"?>
  <method class="org.apache.camel.component.bean.FooBean" name="foo">
    <parameter index="0" type="java.lang.String">
      <annotation class="org.apache.camel.Header">
        <annotation-parameter name="value" value="bar" />
    <parameter index="1" type="java.lang.String">
      <annotation class="org.apache.camel.Body" />

and i change the behavior of the method i started my mail with to test if
annotations are defined in a file before returning the array.

To avoid to load the file each time i need it i created a service to do it.

Finally i can do what i want: to use a pojo without any camel import and
avoiding to create an array to set parameters.

My questions are now:

1) do you think the method can be created in the trunk?
2) i didn't find how to register my service in camel (i added it manually in
my unit test)
3) any thoughts?

PS: i'll upload the code in my repository very soon ( )

- Romain

2011/5/8 Romain Manni-Bucau <>:
> Hi,
> maybe another solution to this problem could be to add a kind of
> descriptor file:
> in camel a bean can extract parameters from headers or something else
> with annotations, if there is a file saying the same thing the bean
> could not use any camel imports but do the same.
> what do you think of a file like:
> <methods>
>    <method class="aaa" method="bbb">
>        <parameter index="ccc">
>              <annotation class="ddd">
>                  <annotation-parameter name="eee" value="fff" />
>              </annotation>
>        </parameter>
>    </method>
> </methods>
> - Romain
> 2011/5/6 Romain Manni-Bucau <>:
>> Hi,
>> i would like to do a route with a bit more bean invocations than
>> usually and i realise the use of array body to specify parameters is
>> not very nice, i always have something like:
>> from(...).to(<create my array>).to("bean:...").to(<save my output in
>> headers and replace the body to continue>)....
>> do you  think it could be improved specifying in the bean component
>> input/output from headers for example?
>> example:
>> - Romain

  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message