[seam-issues] [JBoss JIRA] (SOLDER-116) BeanBuilder create beans that don't support InjectionPoint injection

Antoine Sabot-Durand (Issue Comment Edited) (JIRA) jira-events at lists.jboss.org
Fri Nov 4 09:59:45 EDT 2011


    [ https://issues.jboss.org/browse/SOLDER-116?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12640088#comment-12640088 ] 

Antoine Sabot-Durand edited comment on SOLDER-116 at 11/4/11 9:59 AM:
----------------------------------------------------------------------

I updated my example application with last version of Solder(github project provided in step to reproduce section). The bug is still the same.
In fact in a second thought I wonder if it's not a Weld bug since producing the code bellow (without Solder) produces the same bug :

{code:java}
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, BeanManager bm) {
        
        // use this to read annotations of the class
        AnnotatedType<MyBean> at = bm.createAnnotatedType(MyBean.class); // use this to instantiate the class and inject
                                                                         // dependencies
        final InjectionTarget<MyBean> it = bm.createInjectionTarget(at);
        abd.addBean(new Bean<MyBean>() {
            @Override
            public Class<?> getBeanClass() {
                return MyBean.class;
            }

            @Override
            public Set<InjectionPoint> getInjectionPoints() {
                return it.getInjectionPoints();
            }

            @Override
            public String getName() {
                return "myBean";
            }

            @Override
            public Set<Annotation> getQualifiers() {
                Set<Annotation> qualifiers = new HashSet<Annotation>();
                qualifiers.add(new AnnotationLiteral<Default>() {
                });
                qualifiers.add(new AnnotationLiteral<Any>() {
                });
                return qualifiers;
            }

            @Override
            public Class<? extends Annotation> getScope() {
                return Dependent.class;
            }

            @Override
            public Set<Class<? extends Annotation>> getStereotypes() {
                return Collections.emptySet();
            }

            @Override
            public Set<Type> getTypes() {
                Set<Type> types = new HashSet<Type>();
                types.add(MyBean.class);
                types.add(Object.class);
                return types;
            }

            @Override
            public boolean isAlternative() {
                return false;
            }

            @Override
            public boolean isNullable() {
                return false;
            }

            @Override
            public MyBean create(CreationalContext<MyBean> ctx) {
                MyBean instance = it.produce(ctx);
                it.inject(instance, ctx);
                it.postConstruct(instance);
                return instance;
            }

            @Override
            public void destroy(MyBean instance, CreationalContext<MyBean> ctx) {
                it.preDestroy(instance);
                it.dispose(instance);
                ctx.release();
            }
        });

    }
{code}

Can you take a few minutes to check if I'm doing something stupid in this code ? The goal is to have a bean registered twice, with and without the qualifier.

thanks 
                
      was (Author: antoinesabot-durand):
    I updated my example application with last version of Solder(github project provided in step to reproduce section). The bug is still the same.
In fact in a second thought I wonder if it's not a Weld bug since producing the code bellow (without Solder) produces the same bug :

{{
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, BeanManager bm) {
        
        // use this to read annotations of the class
        AnnotatedType<MyBean> at = bm.createAnnotatedType(MyBean.class); // use this to instantiate the class and inject
                                                                         // dependencies
        final InjectionTarget<MyBean> it = bm.createInjectionTarget(at);
        abd.addBean(new Bean<MyBean>() {
            @Override
            public Class<?> getBeanClass() {
                return MyBean.class;
            }

            @Override
            public Set<InjectionPoint> getInjectionPoints() {
                return it.getInjectionPoints();
            }

            @Override
            public String getName() {
                return "myBean";
            }

            @Override
            public Set<Annotation> getQualifiers() {
                Set<Annotation> qualifiers = new HashSet<Annotation>();
                qualifiers.add(new AnnotationLiteral<Default>() {
                });
                qualifiers.add(new AnnotationLiteral<Any>() {
                });
                return qualifiers;
            }

            @Override
            public Class<? extends Annotation> getScope() {
                return Dependent.class;
            }

            @Override
            public Set<Class<? extends Annotation>> getStereotypes() {
                return Collections.emptySet();
            }

            @Override
            public Set<Type> getTypes() {
                Set<Type> types = new HashSet<Type>();
                types.add(MyBean.class);
                types.add(Object.class);
                return types;
            }

            @Override
            public boolean isAlternative() {
                return false;
            }

            @Override
            public boolean isNullable() {
                return false;
            }

            @Override
            public MyBean create(CreationalContext<MyBean> ctx) {
                MyBean instance = it.produce(ctx);
                it.inject(instance, ctx);
                it.postConstruct(instance);
                return instance;
            }

            @Override
            public void destroy(MyBean instance, CreationalContext<MyBean> ctx) {
                it.preDestroy(instance);
                it.dispose(instance);
                ctx.release();
            }
        });

    }
}}

Can you take a few minutes to check if I'm doing something stupid in this code ? The goal is to have a bean registered twice, with and without the qualifier.

thanks 
                  
> BeanBuilder create beans that don't support InjectionPoint injection
> --------------------------------------------------------------------
>
>                 Key: SOLDER-116
>                 URL: https://issues.jboss.org/browse/SOLDER-116
>             Project: Seam Solder
>          Issue Type: Bug
>          Components: Builders
>    Affects Versions: 3.0.0.Final
>         Environment: MacOS X 10.7 (apple jdk 6) with Arquillian and weld-ee-embedded-1.1 container or JBoss AS 7
>            Reporter: Antoine Sabot-Durand
>            Priority: Critical
>
> I wrote a bean like this one :
> {code:java}
> @MyQualifier
> public class MyBean {
>     @Inject
>     InjectionPoint ip;
>     public String saySomething() {
>         String value = "";
>         if (ip != null)
>             value = ip.getAnnotated().getAnnotation(MyQualifier.class).value();
>         return "Hello CDI World " + value;
>     }
> }
> {code}
> with MyQualifier being a simple qualifier with a non binding parameter value.
> And I wrote an extension which register another version of this bean without Qualifier
> {code:java}
> public class MyExtension implements Extension {
>     @SuppressWarnings({ "unchecked", "rawtypes" })
>     public void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, BeanManager bm) {
>         AnnotatedTypeBuilder annoBuilder = new AnnotatedTypeBuilder().readFromType(MyBean.class).removeFromClass(
>                 MyQualifier.class);
>         AnnotatedType myAnnotatedType = annoBuilder.create();
>         BeanBuilder beanBuilder = new BeanBuilder(bm).readFromType(myAnnotatedType);
>         abd.addBean(beanBuilder.create());
>     }
> }
> {code}
> When bootstrapping Weld I have the following exception :
> {noformat}
> org.jboss.weld.exceptions.DefinitionException: WELD-001405 Cannot inject [field] @Inject org.jboss.solderbug.MyBean.ip in a class which isnt a bean
> 	at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:280)
> 	at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:139)
> 	at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:389)
> 	at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:371)
> 	at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:390)
> 	at org.jboss.arquillian.container.weld.ee.embedded_1_1.mock.TestContainer.startContainer(TestContainer.java:257)
> 	at org.jboss.arquillian.container.weld.ee.embedded_1_1.WeldEEMockContainer.deploy(WeldEEMockContainer.java:98)
> 	...
> {noformat}
> If I comment the @Inject line in the bean everything is fine and I can use both version of the bean (with or without qualifier)

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the seam-issues mailing list