Btw there is some details on #class syntax here https://camel.apache.org/components/3.18.x/others/main.html#_creating_a_custom_bean_with_constructor_parameters
On Thu, Sep 8, 2022 at 2:52 PM Claus Ibsen <claus.ib...@gmail.com> wrote: > > > On Thu, Sep 8, 2022 at 2:39 PM ski n <raymondmees...@gmail.com> wrote: > >> Yes, that was, based on the documentation, the first thing I tried, but I >> got: >> >> org.apache.camel.ResolveEndpointFailedException: Failed to resolve >> endpoint: bean://MyProcessor-1?method=process) due to: No bean could be >> found in the registry for: MyProcessor-1 >> >> That's why I started to register it manually. >> >> Now I added "-1" the templatedBean name itself but then I got: >> >> Failed to resolve endpoint: bean:{{MyProcessor}}?method=process) due to: >> Property with key [MyProcessor] not found in properties from text: >> bean:{{MyProcessor}}?method=process) >> >> This is logical because now {{MyProcessor-1}} is expected. However when I >> provide that, it says " No bean could be found in the registry for: >> MyProcessor-1-1" . So that's a kind of a deadlock. >> >> As a side note: From the user point of view wouldn't it by easy if this >> was >> possible: >> >> .bean("mybean") >> .parameter("{{first constructor parameter}}") >> .parameter("{{second constructor parameter}}") >> .method("mymethod") >> .parameter("{{first method parameter}}") >> .parameter("{{second method parameter}}") >> >> And the parameters in a routeTemplate can then be set with a normal >> templateParameter. >> >> > No the route template DSL is complex already as-is. > See the docs where you can create the bean with inlined groovy or java > (via java-joor). There you can use placeholders. > > You can also try with passing in the parameters as constructor via #class > syntax > > > .templateBean("MyProcessor").type("#class:com.foo.MyProcessor({{myProperty}})") > > > > >> Raymond >> >> >> On Thu, Sep 8, 2022 at 1:51 PM Claus Ibsen <claus.ib...@gmail.com> wrote: >> >> > You should NOT register the processor yourself, this is done by the >> > template bean thingy automatically >> > >> > On Thu, Sep 8, 2022 at 1:39 PM ski n <raymondmees...@gmail.com> wrote: >> > >> > > OK, sorry, I actually read the documentation on bindings and did use >> > > {{MyProcessor}} as the bean name. >> > > >> > > But it didn't work. >> > > >> > > I register my bean/processor as: >> > > >> > > registry.bind("MyProcessor", new MyProcessor("")); >> > > >> > > But when I run it, I got: >> > > >> > > Failed to resolve endpoint: bean://MyProcessor-1?method=process due >> to: >> > No >> > > bean could be found in the registry for: MyProcessor-1 >> > > >> > > Don't know where the "-1" comes from. However when I register it with >> > that >> > > >> > > registry.bind("MyProcessor-1", new MyProcessor("")); >> > > >> > > Then the route works but not with the routetemplate parameter (because >> > it's >> > > already iniaitized. So I tried it with >> > > >> > > registry.bind("MyProcessor-1", MyProcessor.class); >> > > >> > > >> > > Caused by: org.apache.camel.ResolveEndpointFailedException: Failed to >> > > resolve endpoint: bean://MyProcessor-1?method=process due to: >> > > java.lang.NoSuchMethodException: >> > > >> > > I also tried it with method parameters, instead of the constructor. I >> > first >> > > tried to put an extra parameter on the process method, but the >> interface >> > > for Processor doesn't allow that. So I tried to use method >> overloading, >> > but >> > > then it's unclear how to pass the exchange object as a parameter. >> > > >> > > Raymond >> > > >> > > >> > > >> > > >> > > On Thu, Sep 8, 2022 at 12:06 PM Claus Ibsen <claus.ib...@gmail.com> >> > wrote: >> > > >> > > > Hi >> > > > >> > > > No you cannot - you mix standard Java with Camel "parsing" the model >> > when >> > > > it calls the configure() method. >> > > > It would be the same in regular Camel route. >> > > > You basically do standard Java code with a new constructor and pass >> in >> > a >> > > > string literal. Camel is not in use at that point. >> > > > >> > > > In your template bean example, then you need to use {{MyProcessor}} >> as >> > > the >> > > > bean name. >> > > > See the IMPORTANT note at: >> > > > >> > > > >> > > >> > >> https://camel.apache.org/manual/route-template.html#_binding_beans_to_route_template >> > > > >> > > > >> > > > >> > > > On Thu, Sep 8, 2022 at 11:53 AM ski n <raymondmees...@gmail.com> >> > wrote: >> > > > >> > > > > Hi, >> > > > > >> > > > > I have a routetemplate as follows: >> > > > > >> > > > > routeTemplate("processortemplate") >> > > > > .templateParameter("out") >> > > > > .from("direct:in") >> > > > > .process("MyProcessor") >> > > > > .to("{{out}}"); >> > > > > >> > > > > This works. >> > > > > >> > > > > The processor is registered an the called by reference. Now I >> added a >> > > > > constructor argument to the processor and I tried to call it like >> > this: >> > > > > >> > > > > routeTemplate("processortemplate") >> > > > > .templateParameter("processerParam") >> > > > > .templateParameter("out") >> > > > > .from("direct:in") >> > > > > .process(new MyProcessor("{{processorParam}}")) >> > > > > .to("{{out}}"); >> > > > > >> > > > > This doesn't work, because the parameter of the processor is >> parsed >> > > > before >> > > > > the template parameter is parsed. Result is that the parameter >> > > > > {{myProcessorParam}} is passed as literal param. >> > > > > >> > > > > I tried to come with up something like this: >> > > > > >> > > > > routeTemplate("processortemplate") >> > > > > .templateParameter("processerparam") >> > > > > .templateParameter("out") >> > > > > .templateBean("MyProcessor") >> > > > > .typeClass("com.foo.MyProcessor") >> > > > > .property("processerparam", "{{processerparam}}") >> > > > > .end() >> > > > > .from("direct:in") >> > > > > .to("bean:MyProcessor?method=process") >> > > > > .to("{{out}}"); >> > > > > >> > > > > But this didn't pass the parameter as well. As a workaround I set >> > > > > constructor argument as a header and then get the header within >> the >> > > > > processor. >> > > > > >> > > > > Question: >> > > > > >> > > > > Is there a way to pass constructor arguments to a processor in >> > another >> > > > way? >> > > > > I couldn't find anything at the routeTemplate page on how to >> handle >> > > > > processors. >> > > > > >> > > > > Raymond >> > > > > >> > > > >> > > > >> > > > -- >> > > > Claus Ibsen >> > > > ----------------- >> > > > http://davsclaus.com @davsclaus >> > > > Camel in Action 2: https://www.manning.com/ibsen2 >> > > > >> > > >> > >> > >> > -- >> > Claus Ibsen >> > ----------------- >> > http://davsclaus.com @davsclaus >> > Camel in Action 2: https://www.manning.com/ibsen2 >> > >> > > > -- > Claus Ibsen > ----------------- > http://davsclaus.com @davsclaus > Camel in Action 2: https://www.manning.com/ibsen2 > -- Claus Ibsen ----------------- http://davsclaus.com @davsclaus Camel in Action 2: https://www.manning.com/ibsen2