diff --git a/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java b/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java index 3e25a9f..8624eda 100644 --- a/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java +++ b/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java @@ -418,6 +418,7 @@ void createGenericBeans(@Observes AfterBeanDiscovery event, BeanManager beanMana // Register the GenericProduct bean event.addBean(createGenericProductBean(beanManager, genericConfiguration)); + event.addBean(createGenericProductAnnotatedMemberBean(beanManager, genericConfiguration)); if (genericBeanProducerMethods.containsKey(genericConfigurationType)) { @@ -522,6 +523,31 @@ public T create(Bean bean, CreationalContext ctx) }); return builder.create(); } + + private Bean> createGenericProductAnnotatedMemberBean(BeanManager beanManager, final Annotation genericConfiguration) + { + // We don't have a bean created for this generic configuration annotation. Create it, store it to be added later + Synthetic syntheticQualifier = productSyntheticProvider.get(genericConfiguration); + + @SuppressWarnings("unchecked") + final ProducerHolder holder = genericProducers.get(genericConfiguration); + + // TODO make this passivation capable? + BeanBuilder> builder = new BeanBuilder>(beanManager).setBeanClass(AnnotatedMember.class).setQualifiers(Arrays2. asSet(syntheticQualifier)).setBeanLifecycle(new BeanLifecycle>() + { + + public void destroy(Bean> bean, AnnotatedMember instance, CreationalContext> ctx) + { + // No-op + } + + public AnnotatedMember create(Bean> bean, CreationalContext> ctx) + { + return holder.getMember(); + } + }); + return builder.create(); + } /** * Generate a bean to be used to produce the generic bean for each generic diff --git a/impl/src/test/java/org/jboss/weld/extensions/test/bean/generic/field/Garply.java b/impl/src/test/java/org/jboss/weld/extensions/test/bean/generic/field/Garply.java index f513b7a..95a8529 100644 --- a/impl/src/test/java/org/jboss/weld/extensions/test/bean/generic/field/Garply.java +++ b/impl/src/test/java/org/jboss/weld/extensions/test/bean/generic/field/Garply.java @@ -17,6 +17,8 @@ package org.jboss.weld.extensions.test.bean.generic.field; import javax.enterprise.inject.Produces; +import javax.enterprise.inject.spi.AnnotatedMember; +import javax.enterprise.inject.spi.InjectionPoint; import javax.inject.Inject; import org.jboss.weld.extensions.bean.generic.GenericProduct; @@ -36,6 +38,9 @@ public class Garply @Inject @GenericProduct private Waldo waldo; + @Inject @GenericProduct + private AnnotatedMember annotatedMember; + @Produces @WaldoName public String getWaldoName() { @@ -47,4 +52,9 @@ public Waldo getWaldo() return waldo; } + public AnnotatedMember getAnnotatedMember() + { + return annotatedMember; + } + } diff --git a/impl/src/test/java/org/jboss/weld/extensions/test/bean/generic/field/GenericProductTest.java b/impl/src/test/java/org/jboss/weld/extensions/test/bean/generic/field/GenericProductTest.java index de073e7..3dd16a6 100644 --- a/impl/src/test/java/org/jboss/weld/extensions/test/bean/generic/field/GenericProductTest.java +++ b/impl/src/test/java/org/jboss/weld/extensions/test/bean/generic/field/GenericProductTest.java @@ -20,6 +20,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import javax.inject.Inject; @@ -82,5 +83,14 @@ public void testGeneric() assertEquals("Pete", waldoName1); assertEquals("Stuart", waldoName2); + + // Check injection of generic product injection point + assertNotNull(garply1.getAnnotatedMember()); + assertTrue(garply1.getAnnotatedMember().isAnnotationPresent(Service.class)); + assertEquals(1, garply1.getAnnotatedMember().getAnnotation(Service.class).value()); + + assertNotNull(garply2.getAnnotatedMember()); + assertTrue(garply2.getAnnotatedMember().isAnnotationPresent(Service.class)); + assertEquals(2, garply2.getAnnotatedMember().getAnnotation(Service.class).value()); } }