following your hint I removed all spring references and replacing

.to("bean:testBean?scope=Request")

with

.bean(TestBean.class, BeanScope.Request)

I now have the expected behavior.
My goal is to instantiate a dataSource with request scope and reference it
in the sql component like this

.to("sql:classpath:sql/gsl/show_search_path.sql?dataSource=postgresDataSource")

but I don't know how to tell it to take the specific instance that I just
created.
Any suggestions?















Il giorno lun 26 apr 2021 alle ore 11:01 Claus Ibsen <[email protected]>
ha scritto:

> Hi
>
> You need to configure spring to use prototype scoped for the bean, or
> what else scope it may have for that.
> eg on those spring annotations you use.
>
> The camel request scope is only on the Camel side.
>
>
> On Mon, Apr 26, 2021 at 12:03 PM Roberto Gasdia
> <[email protected]> wrote:
> >
> > I am struggling to understand how request scope beans work.
> > I'm using camel 3.8.0 with javaconfig.
> > I've made a simple test with rest component, here is the snippet:
> >
> > ------ bean -------
> >
> > @Component
> > public class TestBean {
> >     private String param = "";
> >
> >     public TestBean() {
> >     }
> >
> >     public String getParam() {
> >         return param;
> >     }
> >
> >     public void init(@Body ParametriTestScope body) {
> >         System.out.println("initial value " + param);
> >         System.out.println("changing state to " + body.getParam());
> >         param = body.getParam();
> >     }
> >
> > }
> >
> >
> > ------ bean spring configuration -------
> >
> > @Configuration
> > public class TestBeanService {
> >
> >     private TestBean test = new TestBean();
> >
> >     @Bean("testBean")
> >     public TestBean getTest() {
> >         return test;
> >     }
> > }
> >
> > and finally the route under test
> >
> > @Component
> > public class RottaTestScope extends RouteBuilder {
> >
> >     @Override
> >     public void configure() {
> >         rest("/testscope").post().type(ParametriTestScope.class)
> >                 .to("direct:process_testscope");
> >
> >         from("direct:process_testscope")
> >                 .to("bean:testBean?scope=Request")
> >
> > .setBody(simple("${bean:testBean?method=getParam&scope=Request}"));
> >     }
> >
> > }
> >
> >
> >
> > I expect this behavior by calling the end point "
> > http://localhost:8080/testscope";
> > First postman call should log:
> >
> > initial value
> > changing state to hello
> >
> > Second postman call should log:
> >
> > initial value
> > changing state to hello
> >
> > On the second postman call it logs instead
> >
> > initial value hello
> > changing state to hello
> >
> > which makes me believe that the bean is cached (default scope).
> >
> > What am I missing?
> >
> > --
> >
> > Roberto Gasdia
> >
> > Software Developer
> >
> > Innoteam - Digital Change
> >
> > Innoteam Srl - Via B. Bedosti, 21 - 61122 Pesaro
> > Phone +39 02 4507 4709 - www.innoteam.it
>
>
>
> --
> Claus Ibsen
> -----------------
> http://davsclaus.com @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2
>


-- 

Roberto Gasdia

Software Developer

Innoteam - Digital Change

Innoteam Srl - Via B. Bedosti, 21 - 61122 Pesaro
Phone +39 02 4507 4709 - www.innoteam.it

Reply via email to