[cdi-dev] Extensions and spec-related observer method injection points question
Mark Struberg
struberg at yahoo.de
Sun Feb 19 15:07:35 EST 2017
What you can portably do is to fire an event in one CDI Extension and observe it in another Extension. Note: not a normal bean, as they are not yet started, but Extension is fine.
There is even a TCK test for it.
LieGrue,
strub
> Am 17.02.2017 um 10:36 schrieb Martin Kouba <mkouba at redhat.com>:
>
> Dne 17.2.2017 v 10:19 Antoine Sabot-Durand napsal(a):
>> Hi all,
>>
>> First Laird, thanks you for all your feedback on CDI, they are very helpful.
>> This section is indeed not clear, but my understanding is this one:
>>
>> 1) As we mention the fact that BeanManager.fire() can be invoked in an
>> extension lifecycle event observer, it makes sense to say observer on
>> lifecycle payload are supported in extension, otherwise firing an event
>> during the BeforeBeanDiscovery lifecycle event for instance would be
>> useless since the only CDI elements "discovered" at this step are
>> portable extensions
>>
>> I tested in various Weld and OWB version, observers on non lifecycle
>> payload are called when BeanManager.fire() is called
>>
>> 2) If extension can contain observers with custom payload that can be
>> invoked during container bootstrapping, it is quite understandable that
>> adding parameters to these observer can bring issue: matching bean may
>> not have been discovered yet and will result in an error.
>
> That's a good point.
>
>> So for me, it makes sense to say that having an observer injecting something else than
>> BeanManager in an extension is not safe and shouldn't be supported
>> In other words
>>
>> void MyObserver(@Observes MyPayload payload) { ... )
>>
>> and
>>
>> void MyObserver(@Observes MyPayload payload, BeanManager bm) { ... )
>>
>> are supported in an extension, but
>>
>> void MyObserver(@Observes MyPayload payload, MyBean bean) { ... )
>>
>> is not because MyBean may be not discovered yet when observer will be
>> triggered.
>>
>> Weld doesn't support it
>
> Are you sure Antoine? I quicly checked the Weld 3 codebase and
> "myObserver(@Observes MyPayload payload, MyBean bean)" should work. We
> only check injection points for container lifecycle events...
>
>> , while OWB does, so we face a non portable
>> feature here ;).
>>
>> 3) A side effect of your mail made me also realise that we mention
>> BeanManger.fire() in this section despite its deprecation in CDI 2.0 (we
>> should mention BeanManager.getEvent().select().fire())
>>
>> This section really needs clarification, I'll create the ticket when we
>> agree on what is part of the spec and not ;).
>>
>>
>> Antoine
>>
>>
>> On Fri, Feb 17, 2017 at 9:16 AM Martin Kouba <mkouba at redhat.com
>> <mailto:mkouba at redhat.com>> wrote:
>>
>> Dne 17.2.2017 v 07:08 Matej Novotny napsal(a):
>>> Hi, comment inline.
>>>
>>> ----- Original Message -----
>>>> From: "Laird Nelson" <ljnelson at gmail.com <mailto:ljnelson at gmail.com>>
>>>> To: cdi-dev at lists.jboss.org <mailto:cdi-dev at lists.jboss.org>
>>>> Sent: Thursday, February 16, 2017 11:11:41 PM
>>>> Subject: [cdi-dev] Extensions and spec-related observer method
>> injection points question
>>>>
>>>> This section (
>>>> http://docs.jboss.org/cdi/spec/2.0-PFD/cdi-spec.html#init_events
>> ) says: "If
>>>> other beans [other than the BeanManager ] are injected into an
>> [portable]
>>>> extension’s observer methods, non-portable behavior results."
>>>>
>>>> Rephrased: a portable extension's observer methods must have a
>> minimum of one
>>>> parameter (the event being observed) and a maximum of two
>> parameters (that
>>>> plus the BeanManager ), and none other if you want to stay truly
>> portable.
>>>
>>> That's correct interpretation.
>>>
>>>> For true container lifecycle events, I understand this (you don't
>> have beans
>>>> to inject yet). But given that a bean must be provided by the
>> container for
>>>> a portable extension (
>>>> http://docs.jboss.org/cdi/spec/2.0-PFD/cdi-spec.html#init_events
>> ), wouldn't
>>>> it be reasonable to permit extra injection points in a portable
>> extension's
>>>> non -container-lifecycle-event-observing observer methods?
>>>>
>>>> Concretely, I'd like to do this:
>>>>
>>>> // In my portable extension
>>>> private static final void doSomethingAtStartup(@Observes
>>>> @Initialized(ApplicationScoped.class) final Object event, final
>> Frobnicator
>>>> someBean) {
>>>> someBean.doSomething();
>>>> }
>>>
>>> While you cannot do this, you can still get hold of BeanManager
>> and use it to resolve your bean.
>>>
>>>>
>>>> ...but that would seem to be in violation of the specification.
>> Could someone
>>
>> It's not a violation, it's a non-portable behavior. Weld should not
>> complain about the injection points of the doSomethingAtStartup()
>> observer method.
>>
>>>> kindly explain why?
>>>
>>> Not really sure, perhaps Martin or Antoine can share the details.
>>> But I would say this could create quite some confusion if in some
>> observer you could inject certain beans and in others you couldn't.
>>
>> Yes, I think the possible confusion was the only reason.
>>
>>> Even in your sample, you can only inject AppScoped beans, so
>> imagine you do such observer for, say, SessionScoped, what can you
>> inject there?
>>> SessionScoped for sure, how about Req? Conversation?
>>>
>>>>
>>>> Thanks,
>>>> Best,
>>>> Laird
>>>>
>>>> _______________________________________________
>>>> cdi-dev mailing list
>>>> cdi-dev at lists.jboss.org <mailto:cdi-dev at lists.jboss.org>
>>>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>>>>
>>>> Note that for all code provided on this list, the provider
>> licenses the code
>>>> under the Apache License, Version 2
>>>> (http://www.apache.org/licenses/LICENSE-2.0.html). For all other
>> ideas
>>>> provided on this list, the provider waives all patent and other
>> intellectual
>>>> property rights inherent in such information.
>>>
>>> _______________________________________________
>>> cdi-dev mailing list
>>> cdi-dev at lists.jboss.org <mailto:cdi-dev at lists.jboss.org>
>>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>>>
>>> Note that for all code provided on this list, the provider
>> licenses the code under the Apache License, Version 2
>> (http://www.apache.org/licenses/LICENSE-2.0.html). For all other
>> ideas provided on this list, the provider waives all patent and
>> other intellectual property rights inherent in such information.
>>>
>>
>> --
>> Martin Kouba
>> Senior Software Engineer
>> Red Hat, Czech Republic
>> _______________________________________________
>> cdi-dev mailing list
>> cdi-dev at lists.jboss.org <mailto:cdi-dev at lists.jboss.org>
>> https://lists.jboss.org/mailman/listinfo/cdi-dev
>>
>> Note that for all code provided on this list, the provider licenses
>> the code under the Apache License, Version 2
>> (http://www.apache.org/licenses/LICENSE-2.0.html). For all other
>> ideas provided on this list, the provider waives all patent and
>> other intellectual property rights inherent in such information.
>>
>
> --
> Martin Kouba
> Senior Software Engineer
> Red Hat, Czech Republic
> _______________________________________________
> cdi-dev mailing list
> cdi-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/cdi-dev
>
> Note that for all code provided on this list, the provider licenses the code under the Apache License, Version 2 (http://www.apache.org/licenses/LICENSE-2.0.html). For all other ideas provided on this list, the provider waives all patent and other intellectual property rights inherent in such information.
More information about the cdi-dev
mailing list