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

Reply via email to