<div dir="ltr">After discussing and testing with Martin we discovered that having an Observer with a payload of type Object and an injected parameter that is not BeanManager is not supported.<div><br></div><div>For instance:</div><div><span style="color:rgb(33,33,33)">void MyObserver(@Observes </span><span style="color:rgb(33,33,33)">Object payload, MyBean bean) { ... )</span><br class="inbox-inbox-Apple-interchange-newline"></div><div><br></div><div>Which makes sense since with observer resolution rules this observer will be invoked for all Lifecycle events.</div><div><br></div><div>Now, when the payload has a qualifier this makes no difference for Weld and the deployment also fails with:</div><div><br></div><div><span style="color:rgb(33,33,33)">void MyObserver(@Observes @Initialized(</span><span style="color:rgb(33,33,33)">ApplicationScoped.class) Object payload, MyBean bean) { ... )</span><br></div><div><span style="color:rgb(33,33,33)"><br></span></div><div><font color="#212121">So discussion may focus on supporting this very specific use case in Weld and eventually in the spec.</font></div><div><font color="#212121"><br></font></div><div><font color="#212121">Antoine</font></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Feb 17, 2017 at 10:52 AM Antoine Sabot-Durand &lt;<a href="mailto:antoine@sabot-durand.net">antoine@sabot-durand.net</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Fri, Feb 17, 2017 at 10:36 AM Martin Kouba &lt;<a href="mailto:mkouba@redhat.com" class="gmail_msg" target="_blank">mkouba@redhat.com</a>&gt; wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dne 17.2.2017 v 10:19 Antoine Sabot-Durand napsal(a):<br class="gmail_msg">
&gt; Hi all,<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; First Laird, thanks you for all your feedback on CDI, they are very helpful.<br class="gmail_msg">
&gt; This section is indeed not clear, but my understanding is this one:<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; 1) As we mention the fact that BeanManager.fire() can be invoked in an<br class="gmail_msg">
&gt; extension lifecycle event observer, it makes sense to say observer on<br class="gmail_msg">
&gt; lifecycle payload are supported in extension, otherwise firing an event<br class="gmail_msg">
&gt; during the BeforeBeanDiscovery lifecycle event for instance would be<br class="gmail_msg">
&gt; useless since the only CDI elements &quot;discovered&quot; at this step are<br class="gmail_msg">
&gt; portable extensions<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; I tested in various Weld and OWB version, observers on non lifecycle<br class="gmail_msg">
&gt; payload are called when BeanManager.fire() is called<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; 2) If extension can contain observers with custom payload that can be<br class="gmail_msg">
&gt; invoked during container bootstrapping, it is quite understandable that<br class="gmail_msg">
&gt; adding parameters to these observer can bring issue: matching bean may<br class="gmail_msg">
&gt; not have been discovered yet and will result in an error.<br class="gmail_msg">
<br class="gmail_msg">
That&#39;s a good point.<br class="gmail_msg">
<br class="gmail_msg">
&gt; So for me, it makes sense to say that having an observer injecting something else than<br class="gmail_msg">
&gt; BeanManager in an extension is not safe and shouldn&#39;t be supported<br class="gmail_msg">
&gt;  In other words<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; void MyObserver(@Observes MyPayload payload) { ... )<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; and<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; void MyObserver(@Observes MyPayload payload, BeanManager bm) { ... )<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; are supported in an extension, but<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; void MyObserver(@Observes MyPayload payload, MyBean bean) { ... )<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; is not because MyBean may be not discovered yet when observer will be<br class="gmail_msg">
&gt; triggered.<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; Weld doesn&#39;t support it<br class="gmail_msg">
<br class="gmail_msg">
Are you sure Antoine? I quicly checked the Weld 3 codebase and<br class="gmail_msg">
&quot;myObserver(@Observes MyPayload payload, MyBean bean)&quot; should work. We<br class="gmail_msg">
only check injection points for container lifecycle events...<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">Oops, you&#39;re right, I was a bit too fast in my writing, what is not supported in Weld (tested with 2.3.2, 2.4.2 and 3.0.0-CR1)and works in OWB is  </div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">void MyObserver(@Observes @Initialized(ApplicationScoped.class) Object payload, MyBean bean) { ... )<br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">Weld throws the following exception:</div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">WELD-000409: Observer method for container lifecycle event can only inject BeanManager<br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg"><span style="color:rgb(33,33,33);font-size:13px" class="gmail_msg">Which is not very clear since the payload is not exactly a container lifecycle event...</span> </div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"> </div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
&gt;, while OWB does, so we face a non portable</blockquote></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br class="gmail_msg">
&gt; feature here ;).<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; 3) A side effect of your mail made me also realise that we mention<br class="gmail_msg">
&gt; BeanManger.fire() in this section despite its deprecation in CDI 2.0 (we<br class="gmail_msg">
&gt; should mention BeanManager.getEvent().select().fire())<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; This section really needs clarification, I&#39;ll create the ticket when we<br class="gmail_msg">
&gt; agree on what is part of the spec and not ;).<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; Antoine<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; On Fri, Feb 17, 2017 at 9:16 AM Martin Kouba &lt;<a href="mailto:mkouba@redhat.com" class="gmail_msg" target="_blank">mkouba@redhat.com</a><br class="gmail_msg">
&gt; &lt;mailto:<a href="mailto:mkouba@redhat.com" class="gmail_msg" target="_blank">mkouba@redhat.com</a>&gt;&gt; wrote:<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;     Dne 17.2.2017 v 07:08 Matej Novotny napsal(a):<br class="gmail_msg">
&gt;     &gt; Hi, comment inline.<br class="gmail_msg">
&gt;     &gt;<br class="gmail_msg">
&gt;     &gt; ----- Original Message -----<br class="gmail_msg">
&gt;     &gt;&gt; From: &quot;Laird Nelson&quot; &lt;<a href="mailto:ljnelson@gmail.com" class="gmail_msg" target="_blank">ljnelson@gmail.com</a> &lt;mailto:<a href="mailto:ljnelson@gmail.com" class="gmail_msg" target="_blank">ljnelson@gmail.com</a>&gt;&gt;<br class="gmail_msg">
&gt;     &gt;&gt; To: <a href="mailto:cdi-dev@lists.jboss.org" class="gmail_msg" target="_blank">cdi-dev@lists.jboss.org</a> &lt;mailto:<a href="mailto:cdi-dev@lists.jboss.org" class="gmail_msg" target="_blank">cdi-dev@lists.jboss.org</a>&gt;<br class="gmail_msg">
&gt;     &gt;&gt; Sent: Thursday, February 16, 2017 11:11:41 PM<br class="gmail_msg">
&gt;     &gt;&gt; Subject: [cdi-dev] Extensions and spec-related observer method<br class="gmail_msg">
&gt;     injection     points question<br class="gmail_msg">
&gt;     &gt;&gt;<br class="gmail_msg">
&gt;     &gt;&gt; This section (<br class="gmail_msg">
&gt;     &gt;&gt; <a href="http://docs.jboss.org/cdi/spec/2.0-PFD/cdi-spec.html#init_events" rel="noreferrer" class="gmail_msg" target="_blank">http://docs.jboss.org/cdi/spec/2.0-PFD/cdi-spec.html#init_events</a><br class="gmail_msg">
&gt;     ) says: &quot;If<br class="gmail_msg">
&gt;     &gt;&gt; other beans [other than the BeanManager ] are injected into an<br class="gmail_msg">
&gt;     [portable]<br class="gmail_msg">
&gt;     &gt;&gt; extension’s observer methods, non-portable behavior results.&quot;<br class="gmail_msg">
&gt;     &gt;&gt;<br class="gmail_msg">
&gt;     &gt;&gt; Rephrased: a portable extension&#39;s observer methods must have a<br class="gmail_msg">
&gt;     minimum of one<br class="gmail_msg">
&gt;     &gt;&gt; parameter (the event being observed) and a maximum of two<br class="gmail_msg">
&gt;     parameters (that<br class="gmail_msg">
&gt;     &gt;&gt; plus the BeanManager ), and none other if you want to stay truly<br class="gmail_msg">
&gt;     portable.<br class="gmail_msg">
&gt;     &gt;<br class="gmail_msg">
&gt;     &gt; That&#39;s correct interpretation.<br class="gmail_msg">
&gt;     &gt;<br class="gmail_msg">
&gt;     &gt;&gt; For true container lifecycle events, I understand this (you don&#39;t<br class="gmail_msg">
&gt;     have beans<br class="gmail_msg">
&gt;     &gt;&gt; to inject yet). But given that a bean must be provided by the<br class="gmail_msg">
&gt;     container for<br class="gmail_msg">
&gt;     &gt;&gt; a portable extension (<br class="gmail_msg">
&gt;     &gt;&gt; <a href="http://docs.jboss.org/cdi/spec/2.0-PFD/cdi-spec.html#init_events" rel="noreferrer" class="gmail_msg" target="_blank">http://docs.jboss.org/cdi/spec/2.0-PFD/cdi-spec.html#init_events</a><br class="gmail_msg">
&gt;     ), wouldn&#39;t<br class="gmail_msg">
&gt;     &gt;&gt; it be reasonable to permit extra injection points in a portable<br class="gmail_msg">
&gt;     extension&#39;s<br class="gmail_msg">
&gt;     &gt;&gt; non -container-lifecycle-event-observing observer methods?<br class="gmail_msg">
&gt;     &gt;&gt;<br class="gmail_msg">
&gt;     &gt;&gt; Concretely, I&#39;d like to do this:<br class="gmail_msg">
&gt;     &gt;&gt;<br class="gmail_msg">
&gt;     &gt;&gt; // In my portable extension<br class="gmail_msg">
&gt;     &gt;&gt; private static final void doSomethingAtStartup(@Observes<br class="gmail_msg">
&gt;     &gt;&gt; @Initialized(ApplicationScoped.class) final Object event, final<br class="gmail_msg">
&gt;     Frobnicator<br class="gmail_msg">
&gt;     &gt;&gt; someBean) {<br class="gmail_msg">
&gt;     &gt;&gt; someBean.doSomething();<br class="gmail_msg">
&gt;     &gt;&gt; }<br class="gmail_msg">
&gt;     &gt;<br class="gmail_msg">
&gt;     &gt; While you cannot do this, you can still get hold of BeanManager<br class="gmail_msg">
&gt;     and use it to resolve your bean.<br class="gmail_msg">
&gt;     &gt;<br class="gmail_msg">
&gt;     &gt;&gt;<br class="gmail_msg">
&gt;     &gt;&gt; ...but that would seem to be in violation of the specification.<br class="gmail_msg">
&gt;     Could someone<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;     It&#39;s not a violation, it&#39;s a non-portable behavior. Weld should not<br class="gmail_msg">
&gt;     complain about the injection points of the doSomethingAtStartup()<br class="gmail_msg">
&gt;     observer method.<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;     &gt;&gt; kindly explain why?<br class="gmail_msg">
&gt;     &gt;<br class="gmail_msg">
&gt;     &gt; Not really sure, perhaps Martin or Antoine can share the details.<br class="gmail_msg">
&gt;     &gt; But I would say this could create quite some confusion if in some<br class="gmail_msg">
&gt;     observer you could inject certain beans and in others you couldn&#39;t.<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;     Yes, I think the possible confusion was the only reason.<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;     &gt; Even in your sample, you can only inject AppScoped beans, so<br class="gmail_msg">
&gt;     imagine you do such observer for, say, SessionScoped, what can you<br class="gmail_msg">
&gt;     inject there?<br class="gmail_msg">
&gt;     &gt; SessionScoped for sure, how about Req? Conversation?<br class="gmail_msg">
&gt;     &gt;<br class="gmail_msg">
&gt;     &gt;&gt;<br class="gmail_msg">
&gt;     &gt;&gt; Thanks,<br class="gmail_msg">
&gt;     &gt;&gt; Best,<br class="gmail_msg">
&gt;     &gt;&gt; Laird<br class="gmail_msg">
&gt;     &gt;&gt;<br class="gmail_msg">
&gt;     &gt;&gt; _______________________________________________<br class="gmail_msg">
&gt;     &gt;&gt; cdi-dev mailing list<br class="gmail_msg">
&gt;     &gt;&gt; <a href="mailto:cdi-dev@lists.jboss.org" class="gmail_msg" target="_blank">cdi-dev@lists.jboss.org</a> &lt;mailto:<a href="mailto:cdi-dev@lists.jboss.org" class="gmail_msg" target="_blank">cdi-dev@lists.jboss.org</a>&gt;<br class="gmail_msg">
&gt;     &gt;&gt; <a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br class="gmail_msg">
&gt;     &gt;&gt;<br class="gmail_msg">
&gt;     &gt;&gt; Note that for all code provided on this list, the provider<br class="gmail_msg">
&gt;     licenses the code<br class="gmail_msg">
&gt;     &gt;&gt; under the Apache License, Version 2<br class="gmail_msg">
&gt;     &gt;&gt; (<a href="http://www.apache.org/licenses/LICENSE-2.0.html" rel="noreferrer" class="gmail_msg" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>). For all other<br class="gmail_msg">
&gt;     ideas<br class="gmail_msg">
&gt;     &gt;&gt; provided on this list, the provider waives all patent and other<br class="gmail_msg">
&gt;     intellectual<br class="gmail_msg">
&gt;     &gt;&gt; property rights inherent in such information.<br class="gmail_msg">
&gt;     &gt;<br class="gmail_msg">
&gt;     &gt; _______________________________________________<br class="gmail_msg">
&gt;     &gt; cdi-dev mailing list<br class="gmail_msg">
&gt;     &gt; <a href="mailto:cdi-dev@lists.jboss.org" class="gmail_msg" target="_blank">cdi-dev@lists.jboss.org</a> &lt;mailto:<a href="mailto:cdi-dev@lists.jboss.org" class="gmail_msg" target="_blank">cdi-dev@lists.jboss.org</a>&gt;<br class="gmail_msg">
&gt;     &gt; <a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br class="gmail_msg">
&gt;     &gt;<br class="gmail_msg">
&gt;     &gt; Note that for all code provided on this list, the provider<br class="gmail_msg">
&gt;     licenses the code under the Apache License, Version 2<br class="gmail_msg">
&gt;     (<a href="http://www.apache.org/licenses/LICENSE-2.0.html" rel="noreferrer" class="gmail_msg" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>). For all other<br class="gmail_msg">
&gt;     ideas provided on this list, the provider waives all patent and<br class="gmail_msg">
&gt;     other intellectual property rights inherent in such information.<br class="gmail_msg">
&gt;     &gt;<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;     --<br class="gmail_msg">
&gt;     Martin Kouba<br class="gmail_msg">
&gt;     Senior Software Engineer<br class="gmail_msg">
&gt;     Red Hat, Czech Republic<br class="gmail_msg">
&gt;     _______________________________________________<br class="gmail_msg">
&gt;     cdi-dev mailing list<br class="gmail_msg">
&gt;     <a href="mailto:cdi-dev@lists.jboss.org" class="gmail_msg" target="_blank">cdi-dev@lists.jboss.org</a> &lt;mailto:<a href="mailto:cdi-dev@lists.jboss.org" class="gmail_msg" target="_blank">cdi-dev@lists.jboss.org</a>&gt;<br class="gmail_msg">
&gt;     <a href="https://lists.jboss.org/mailman/listinfo/cdi-dev" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;     Note that for all code provided on this list, the provider licenses<br class="gmail_msg">
&gt;     the code under the Apache License, Version 2<br class="gmail_msg">
&gt;     (<a href="http://www.apache.org/licenses/LICENSE-2.0.html" rel="noreferrer" class="gmail_msg" target="_blank">http://www.apache.org/licenses/LICENSE-2.0.html</a>). For all other<br class="gmail_msg">
&gt;     ideas provided on this list, the provider waives all patent and<br class="gmail_msg">
&gt;     other intellectual property rights inherent in such information.<br class="gmail_msg">
&gt;<br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
Martin Kouba<br class="gmail_msg">
Senior Software Engineer<br class="gmail_msg">
Red Hat, Czech Republic<br class="gmail_msg">
</blockquote></div></div></blockquote></div>