CDI alternatives with multiple archives
john.sanda Dec 16, 2015 10:31 AMI have a CDI alternative producer method in one JAR. I have tested and verified that I am able to use an alternative producer method in an Arquillian integration test. I am running on WildFly 10. Here is the relevant code,
@Dependent public class DefaultObjectMapperProducer { @Produces public ObjectMapper getMapper() { ... } } // Stereotype annotation @Stereotype @Alternative @Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface CustomObjectMapper { } // alternative producer @Dependent public class TestObjectMapperProducer { @Produces @CustomObjectMapper public ObjectMapper getMapper() { ... } }
and here is my beans.xml (used for testing only),
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" version="1.1" bean-discovery-mode="annotated"> <alternatives> <stereotype>CustomObjectMapper</stereotype> </alternatives> </beans>
I have verified that things work as expected in my integration test, but in the test both producer classes are deployed in the archive/JAR. I have another test that deploys a WAR with the default producer in WEB-INF/lib and the alternative in WEB-INF/classes. The beans.xml that is packaged in the WAR looks similar to the example above. And then there is an empty beans.xml that is packaged in the JAR file in which the default mapper resides.
I enabled debug logging for Weld and I see a couple relevant messages,
DEBUG [org.jboss.weld.Bootstrap] (MSC service thread 1-7) WELD-000106: Bean: Producer Method [ObjectMapper] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces @CustomObjectMapper public CustomObjectMapperProducer.getMapper()] DEBUG [org.jboss.weld.Bootstrap] (MSC service thread 1-7) WELD-000103: Enabled alternatives for Weld BeanManager for /content/80dcabb1-33de-4feb-a967-a5100a4683fd.war [bean count=2]: - interface CustomObjectMapper
Based on those log messages it looks like Weld is discovering my alternative producer, but it is not getting used in place of the default. I also tried added the @Priority annotation to my alternative class, but that did not help. How can I make a CDI alternative work when it lives in a separate archive from the original bean?