i did a poc, i need a modification in camel-core, here is the diff:
Index: src/main/java/org/apache/camel/component/bean/BeanInfo.java =================================================================== --- src/main/java/org/apache/camel/component/bean/BeanInfo.java (rĂ©vision 1100337) +++ src/main/java/org/apache/camel/component/bean/BeanInfo.java (copie de travail) @@ -289,7 +289,7 @@ @SuppressWarnings("unchecked") protected MethodInfo createMethodInfo(Class clazz, Method method) { Class[] parameterTypes = method.getParameterTypes(); - Annotation[][] parametersAnnotations = method.getParameterAnnotations(); + Annotation[][] parametersAnnotations = getAnnotationsFor(method); List<ParameterInfo> parameters = new ArrayList<ParameterInfo>(); List<ParameterInfo> bodyParameters = new ArrayList<ParameterInfo>(); @@ -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 match * 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"?> <methods> <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" /> </annotation> </parameter> <parameter index="1" type="java.lang.String"> <annotation class="org.apache.camel.Body" /> </parameter> </method> </methods> 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 ( http://code.google.com/p/rmannibucau/ ) - Romain 2011/5/8 Romain Manni-Bucau <rmannibu...@gmail.com>: > 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 <rmannibu...@gmail.com>: >> 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: from(...).to("bean:foo.bar.MyClass?method=hello¶meter[0]=header(first)&aprameter[2]=header(other)&result=header(out)").to(...) >> >> - Romain >> >