[cdi-dev] Clarification on 4.3 Specialization

Matej Novotny manovotn at redhat.com
Mon Nov 23 06:13:39 EST 2015


Hi, Emily

before we delve into questions regarding spec clarification, I have two questions for you :)

1) What is the point of disabling @Specialized bean(be it with @Veto or @Alternative) when you have no other @Specialized bean to take its place?
 - this use case just feels....weird at best?
 - to me it seems rather unusual, I guess you need to achieve different behavior in two cases - that's what you can do with 2 @Spec beans

2) Isn't there always a way around to achieve what you are aiming for?
 - enabling it app-wise with @Priority or using two @Specialized beans with additional qualifiers?
 - this way you are still moving within boundaries of current spec and can achieve the same goal
 - could you, please, give me a use-case where your scenario is absolutely necessary?

Matej

----- Original Message -----
From: "Emily Jiang" <emijiang6 at googlemail.com>
To: "Martin Kouba" <mkouba at redhat.com>
Cc: "Matej Novotny" <manovotn at redhat.com>, "cdi-dev" <cdi-dev at lists.jboss.org>
Sent: Monday, November 23, 2015 11:30:54 AM
Subject: Re: [cdi-dev] Clarification on 4.3 Specialization

Hi Martin,
Although the spec does not enforce that @Specialized must be used in
conjunction with @Alternative , I would like to unify the understanding of
what the spec behavior of @Specialized on an disabled bean is.

Thanks
Emily

On Mon, Nov 23, 2015 at 10:06 AM, Martin Kouba <mkouba at redhat.com> wrote:

> Hi Emily,
>
> the problem is Specialization is not defined per bean archive but per
> application. A bean is either specialized or not. Note that specialization
> is not tied to alternatives.
>
> WRT your use-case: the specializing bean should be enabled globally or in
> each bean archive which is using the specialized bean.
>
> Martin
>
> Dne 23.11.2015 v 10:54 Emily Jiang napsal(a):
>
>> Thank you Tom and Matej for your response!
>> The alternative was enabled in the archive beans-xml-modified.jar, but
>> it is not enabled in the archive beans-xml-modified2.jar. The issue is
>> not with alternative but with Specialized.
>>
>> At the moment, Weld specialized is effective even if itself is not
>> enabled, which is not desirable because it disables other bean but
>> itself is not enabled. As a consequence, this causes deployment error.
>>
>> The CDI 1.2 section 4.3  spec says:
>> When an enabled bean, as defined in Section 5.1.2, “Enabled and disabled
>> beans”, specializes
>> a second bean, we can be certain that the second bean is never
>> instantiated or called by the
>> container. Even if the second bean defines a producer or observer
>> method, the method will never
>> be called.
>>
>> It is true the above sentence comments about an enabled bean. It hits an
>> disabled bean should not specialize a second bean. If you guys think it
>> is unclear, can we update the spec to clarify this scenario?
>>
>> By the way, OWB and Weld behave differently (Weld thinks a disabled bean
>> still specializes a second bean while OWB thinks a disabled bean does
>> NOT specialize a second bean). This is something we can leave to
>> implementation. We should spec it!
>>
>> On Mon, Nov 23, 2015 at 8:45 AM, Matej Novotny <manovotn at redhat.com
>> <mailto:manovotn at redhat.com>> wrote:
>>
>>     Hello Emily
>>
>>     I agree with Tom. In your case, specialized producer is enabled (via
>>     beans.xml) although only per bean archive.
>>
>>
>>     And about this:
>>     >>From Weld's perspective, any bean annotated with @Specialized
>> disables a second bean regardless whether itself is active or not.
>>
>>     It is true, however the spec doesn't define how does a @Specialized
>>     bean behave when it is disabled (or at least I haven't found that
>> bit).
>>     So this leaves it up to implementation and I can't really see a
>>     problem with it. Why would you create a @Specialized bean and
>>     disable it afterwards (with no other @Specialized and/or
>>     @Alternative active)?
>>
>>
>>     Matej
>>
>>     ----- Original Message -----
>>     From: "Tomas Remes" <tremes at redhat.com <mailto:tremes at redhat.com>>
>>     To: "Emily Jiang" <emijiang6 at googlemail.com
>>     <mailto:emijiang6 at googlemail.com>>
>>     Cc: "cdi-dev" <cdi-dev at lists.jboss.org <mailto:
>> cdi-dev at lists.jboss.org>>
>>     Sent: Monday, November 23, 2015 8:33:44 AM
>>     Subject: Re: [cdi-dev] Clarification on 4.3 Specialization
>>
>>
>>     Hi Emily,
>>
>>     I am not sure I follow. What is disabled?
>>     AlternativeCounterProducerModified? I can see
>>     AlternativeCounterProducerModified is enabled in beans.xml of the
>>     given bean archive and it means it is selected alternative only per
>>     the bean archive. So I can't see any problem (or maybe I don't fully
>>     understand).
>>
>>     Tom
>>
>>     ----- Original Message -----
>>     From: "Emily Jiang" <emijiang6 at googlemail.com
>>     <mailto:emijiang6 at googlemail.com>>
>>     To: "cdi-dev" <cdi-dev at lists.jboss.org <mailto:
>> cdi-dev at lists.jboss.org>>
>>     Sent: Sunday, November 22, 2015 10:42:29 PM
>>     Subject: Re: [cdi-dev] Clarification on 4.3 Specialization
>>
>>     any thoughts?
>>
>>     Should a bean with @Specialize disable a bean even if it is disabled
>>     itself?
>>
>>     On Thu, Nov 19, 2015 at 10:09 AM, Emily Jiang <
>>     emijiang6 at googlemail.com <mailto:emijiang6 at googlemail.com> > wrote:
>>
>>
>>
>>
>>     I have an application containing two wars.
>>
>>     testDiffBDA.war
>>     testDiffBDA.war/WEB-INF/classes/test/diff/web/FrontEndServlet.class
>>
>>     @Inject CounterProducerConsumerModified2 bean;
>>
>>
>>     beans-xml-modified2.jar
>>     containing one bean and an empty-ish beans.xml :
>>     @Inject at CounterModifiedQualifier String modifiedProducer;
>>
>>     beans-xml-modified.jar.jar
>>     CounterModifiedQualifier (the interface)
>>     CounterProducerModified (the bean implementing that interface)
>>     AlternativeCounterProducerModified (an alternative specialized bean)
>>     beans.xml
>>     <alternatives>
>>
>> <class>com.ibm.jcdi.test.beansxml.AlternativeCounterProducerModified</class>
>>     </alternatives>
>>
>>     My application failed deployment with the error on Weld but worked
>>     on OpenWebBeans
>>
>>     [ERROR ] CWWKZ0004E: An exception occurred while starting the
>>     application testDiffBDA. The exception message was:
>>     com.ibm.ws.container.service.state.StateChangeException:
>>     org.jboss.weld.exceptions.DeploymentException: WELD-001408:
>>     Unsatisfied dependencies for type String with qualifiers
>>     @CounterModifiedQualifier
>>     at injection point [BackedAnnotatedField] @Inject
>>     @CounterModifiedQualifier
>>
>> com.ibm.jcdi.test.beansxml.CounterProducerConsumerModified2.modifiedProducer
>>     at
>>
>> com.ibm.jcdi.test.beansxml.CounterProducerConsumerModified2.modifiedProducer(CounterProducerConsumerModified2.java:0)
>>     --
>>
>>
>>     After further investigation and talking to Martin from Weld, the
>>     error was caused due to the fact of
>>     AlternativeCounterProducerModified disabling the
>>     CounterProducerModified bean but itself is not enabled in the jar of
>>     beans-xml-modified2.jar. Therefore, no producer is active to produce
>>     a bean with the qualifier CounterModifiedQualifier.
>>
>>      >From Weld's perspective, any bean annotated with @Specialized
>>     disables a second bean regardless whether itself is active or not.
>>
>>     My understanding is that the specialized should only take effect if
>>     itself is enabled. Otherwise, we run into the situation of where the
>>     specialized bean is not enabled but it disabled another bean. To me,
>>     it is wrong.
>>
>>
>>     I also checked the spec:
>>     @Alternative @Specializes
>>     public class MockAsynchronousService extends AsynchronousService {
>>     ...
>>     }
>>     When an enabled bean, as defined in Section 5.1.2, “Enabled and
>>     disabled beans”, specializes
>>     a second bean, we can be certain that the second bean is never
>>     instantiated or called by the
>>     container. Even if the second bean defines a producer or observer
>>     method, the method will never
>>     be called.
>>
>>     The spec says only an enabled bean can specialize a second bean. I
>>     would like to know what other people think.
>>
>>
>>     Thanks
>>     Emily
>>     =================
>>     Emily Jiang
>>     ejiang at apache.org <mailto:ejiang at apache.org>
>>
>>
>>
>>     --
>>     Thanks
>>     Emily
>>     =================
>>     Emily Jiang
>>     ejiang at apache.org <mailto:ejiang at apache.org>
>>
>>     _______________________________________________
>>     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.
>>
>>     --
>>     Tomas Remes
>>
>>
>>     _______________________________________________
>>     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.
>>
>>
>>
>>
>> --
>> Thanks
>> Emily
>> =================
>> Emily Jiang
>> ejiang at apache.org <mailto:ejiang at apache.org>
>>
>>
>> _______________________________________________
>> 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.
>>
>>
> --
> Martin Kouba
> Software Engineer
> Red Hat, Czech Republic
>



-- 
Thanks
Emily
=================
Emily Jiang
ejiang at apache.org



More information about the cdi-dev mailing list