You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@isis.apache.org by GESCONSULTOR - Óscar Bou <o....@gesconsultor.com> on 2013/11/17 17:15:12 UTC

Services still not injected when entering @PostConstruct methods on a Service

Hi to all.

I have an Isis service that needs to initialize a "server" upon creation (it's a Drools session, but it would be the same with an email server, for instance).

For initializing that "server", I need to pass it references to other Isis services (in this case Drools globals).

If, as per [1], I try like this:

    @PostConstruct
    public void init(final Map<?, ?> props) {

	server.setGlobal("eventOccurrences", this.eventOccurrences);

	
    }

    ....

    // {{ injected: EventOccurrences
    private EventOccurrences eventOccurrences;

    public final void injectEventOccurrences(final EventOccurrences eventOccurrences) {
        this.eventOccurrences = eventOccurrences;
    }

    // }}


The problem is that when the execution arrives to:
server.setGlobal("eventOccurrences", this.eventOccurrences);


this.eventOccurrences is still null... So it has not yet been injected (or instantiated).

I must ensure that the server starts to run from the beginning of the Isis application execution.

There's a note on [1] footer, but I thought this is not the case, as my only expectation is that services are injected when calling "@PostConstruct" methods.


Perhaps I'm missing something basic or the previous expectation is precisely the one explicited by the footer note ...

If that's the case, is there a better way to solve it?


Thanks,

Oscar


[1] http://isis.apache.org/core/services/initializing-services.html






Re: Services still not injected when entering @PostConstruct methods on a Service

Posted by GESCONSULTOR - Óscar Bou <o....@gesconsultor.com>.
Thanks, Dan.

Tickets created.

Regards,

Oscar


El 19/11/2013, a las 08:19, Dan Haywood <da...@haywood-associates.co.uk> escribió:

> Hi Oscar,
> I agree this should change.  Could you raise a JIRA ticket for this? and
> I'll have a look at changing it.
> 
> On a related note (though probably a separate ticket), I reckon we should
> also support @Inject (on the field name) rather than the use of a setXxx()
> or injectXxx() method.
> 
> Cheers
> Dan
> 
> 
> On 17 November 2013 16:29, GESCONSULTOR - Óscar Bou
> <o....@gesconsultor.com>wrote:
> 
>> 
>> Just to point it out, as per [1] and [2], @PostConstruct should only be
>> called after all dependencies have been injected.
>> 
>> Thanks again,
>> 
>> Oscar
>> 
>> 
>> [1]
>> http://docs.oracle.com/javaee/5/api/javax/annotation/PostConstruct.html
>> 
>> [2]
>> http://wiki.eclipse.org/Eclipse4/RCP/Dependency_Injection#.40PostConstruct.2C_.40PreDestroy_.28javax.annotation.29
>> 
>> 
>> 
>> 
>> El 17/11/2013, a las 17:15, GESCONSULTOR - Óscar Bou <
>> o.bou@gesconsultor.com> escribió:
>> 
>>> Hi to all.
>>> 
>>> I have an Isis service that needs to initialize a "server" upon creation
>> (it's a Drools session, but it would be the same with an email server, for
>> instance).
>>> 
>>> For initializing that "server", I need to pass it references to other
>> Isis services (in this case Drools globals).
>>> 
>>> If, as per [1], I try like this:
>>> 
>>>   @PostConstruct
>>>   public void init(final Map<?, ?> props) {
>>> 
>>>      server.setGlobal("eventOccurrences", this.eventOccurrences);
>>> 
>>> 
>>>   }
>>> 
>>>   ....
>>> 
>>>   // {{ injected: EventOccurrences
>>>   private EventOccurrences eventOccurrences;
>>> 
>>>   public final void injectEventOccurrences(final EventOccurrences
>> eventOccurrences) {
>>>       this.eventOccurrences = eventOccurrences;
>>>   }
>>> 
>>>   // }}
>>> 
>>> 
>>> The problem is that when the execution arrives to:
>>> server.setGlobal("eventOccurrences", this.eventOccurrences);
>>> 
>>> 
>>> this.eventOccurrences is still null... So it has not yet been injected
>> (or instantiated).
>>> 
>>> I must ensure that the server starts to run from the beginning of the
>> Isis application execution.
>>> 
>>> There's a note on [1] footer, but I thought this is not the case, as my
>> only expectation is that services are injected when calling
>> "@PostConstruct" methods.
>>> 
>>> 
>>> Perhaps I'm missing something basic or the previous expectation is
>> precisely the one explicited by the footer note ...
>>> 
>>> If that's the case, is there a better way to solve it?
>>> 
>>> 
>>> Thanks,
>>> 
>>> Oscar
>>> 
>>> 
>>> [1] http://isis.apache.org/core/services/initializing-services.html
>>> 
>>> 
>>> 
>>> 
>>> 
>> 
>> 


Re: Services still not injected when entering @PostConstruct methods on a Service

Posted by Dan Haywood <da...@haywood-associates.co.uk>.
Hi Oscar,
I agree this should change.  Could you raise a JIRA ticket for this? and
I'll have a look at changing it.

On a related note (though probably a separate ticket), I reckon we should
also support @Inject (on the field name) rather than the use of a setXxx()
or injectXxx() method.

Cheers
Dan


On 17 November 2013 16:29, GESCONSULTOR - Óscar Bou
<o....@gesconsultor.com>wrote:

>
> Just to point it out, as per [1] and [2], @PostConstruct should only be
> called after all dependencies have been injected.
>
> Thanks again,
>
> Oscar
>
>
> [1]
> http://docs.oracle.com/javaee/5/api/javax/annotation/PostConstruct.html
>
> [2]
> http://wiki.eclipse.org/Eclipse4/RCP/Dependency_Injection#.40PostConstruct.2C_.40PreDestroy_.28javax.annotation.29
>
>
>
>
> El 17/11/2013, a las 17:15, GESCONSULTOR - Óscar Bou <
> o.bou@gesconsultor.com> escribió:
>
> > Hi to all.
> >
> > I have an Isis service that needs to initialize a "server" upon creation
> (it's a Drools session, but it would be the same with an email server, for
> instance).
> >
> > For initializing that "server", I need to pass it references to other
> Isis services (in this case Drools globals).
> >
> > If, as per [1], I try like this:
> >
> >    @PostConstruct
> >    public void init(final Map<?, ?> props) {
> >
> >       server.setGlobal("eventOccurrences", this.eventOccurrences);
> >
> >
> >    }
> >
> >    ....
> >
> >    // {{ injected: EventOccurrences
> >    private EventOccurrences eventOccurrences;
> >
> >    public final void injectEventOccurrences(final EventOccurrences
> eventOccurrences) {
> >        this.eventOccurrences = eventOccurrences;
> >    }
> >
> >    // }}
> >
> >
> > The problem is that when the execution arrives to:
> > server.setGlobal("eventOccurrences", this.eventOccurrences);
> >
> >
> > this.eventOccurrences is still null... So it has not yet been injected
> (or instantiated).
> >
> > I must ensure that the server starts to run from the beginning of the
> Isis application execution.
> >
> > There's a note on [1] footer, but I thought this is not the case, as my
> only expectation is that services are injected when calling
> "@PostConstruct" methods.
> >
> >
> > Perhaps I'm missing something basic or the previous expectation is
> precisely the one explicited by the footer note ...
> >
> > If that's the case, is there a better way to solve it?
> >
> >
> > Thanks,
> >
> > Oscar
> >
> >
> > [1] http://isis.apache.org/core/services/initializing-services.html
> >
> >
> >
> >
> >
>
>

Re: Services still not injected when entering @PostConstruct methods on a Service

Posted by GESCONSULTOR - Óscar Bou <o....@gesconsultor.com>.
Just to point it out, as per [1] and [2], @PostConstruct should only be called after all dependencies have been injected.

Thanks again,

Oscar


[1] http://docs.oracle.com/javaee/5/api/javax/annotation/PostConstruct.html

[2] http://wiki.eclipse.org/Eclipse4/RCP/Dependency_Injection#.40PostConstruct.2C_.40PreDestroy_.28javax.annotation.29




El 17/11/2013, a las 17:15, GESCONSULTOR - Óscar Bou <o....@gesconsultor.com> escribió:

> Hi to all.
> 
> I have an Isis service that needs to initialize a "server" upon creation (it's a Drools session, but it would be the same with an email server, for instance).
> 
> For initializing that "server", I need to pass it references to other Isis services (in this case Drools globals).
> 
> If, as per [1], I try like this:
> 
>    @PostConstruct
>    public void init(final Map<?, ?> props) {
> 
> 	server.setGlobal("eventOccurrences", this.eventOccurrences);
> 
> 	
>    }
> 
>    ....
> 
>    // {{ injected: EventOccurrences
>    private EventOccurrences eventOccurrences;
> 
>    public final void injectEventOccurrences(final EventOccurrences eventOccurrences) {
>        this.eventOccurrences = eventOccurrences;
>    }
> 
>    // }}
> 
> 
> The problem is that when the execution arrives to:
> server.setGlobal("eventOccurrences", this.eventOccurrences);
> 
> 
> this.eventOccurrences is still null... So it has not yet been injected (or instantiated).
> 
> I must ensure that the server starts to run from the beginning of the Isis application execution.
> 
> There's a note on [1] footer, but I thought this is not the case, as my only expectation is that services are injected when calling "@PostConstruct" methods.
> 
> 
> Perhaps I'm missing something basic or the previous expectation is precisely the one explicited by the footer note ...
> 
> If that's the case, is there a better way to solve it?
> 
> 
> Thanks,
> 
> Oscar
> 
> 
> [1] http://isis.apache.org/core/services/initializing-services.html
> 
> 
> 
> 
>