[cdi-dev] Clarification on 4.3 Specialization

Matej Novotny manovotn at redhat.com
Mon Nov 23 03:45:19 EST 2015


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>
To: "Emily Jiang" <emijiang6 at googlemail.com>
Cc: "cdi-dev" <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>
To: "cdi-dev" <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 > 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 



-- 
Thanks 
Emily 
================= 
Emily Jiang 
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.

-- 
Tomas Remes


_______________________________________________
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