[weld-dev] Do Custom implementations of Bean need to provide injection points?

Martin Kouba mkouba at redhat.com
Fri Aug 4 08:48:49 EDT 2017


Something like this should do the trick:

    new InjectionPoint() {

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

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

             @Override
             public Type getType() {
                 return InjectionPoint.class;
             }

             @Override
             public Set<Annotation> getQualifiers() {
return Collections.<Annotation> singleton(new 
AnnotationLiteral<Default>() {});
             }

             @Override
             public Member getMember() {
                 return null;
             }

             @Override
             public Bean<?> getBean() {
                 return this;
             }

             @Override
             public Annotated getAnnotated() {
                 return null;
             }
         };

Martin

Dne 4.8.2017 v 14:35 John D. Ament napsal(a):
> Martin,
> 
> Knowing that I don't have any reference to an injection point, what 
> would you recommend I pass in as a dummy injection point?
> 
> John
> 
> On Fri, Aug 4, 2017 at 8:07 AM Martin Kouba <mkouba at redhat.com 
> <mailto:mkouba at redhat.com>> wrote:
> 
>     Hm, I think BeanManager.getReference() should not be used here, see also
>     6.5.3. Contextual reference for a bean [1]:
> 
>     "The container must ensure that every injection point of type
>     InjectionPoint and qualifier @Default of any dependent object
>     instantiated during this process receives a null value if it is not
>     being injected into any injection point."
> 
>     However, in Weld you could use
>     BeanManager.getInjectableReference(InjectionPoint, CreationalContext<?>)
>     and provide some dummy IP. See for example
>     https://github.com/weld/core/blob/master/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/custom/BarBean.java#L50.
> 
>     FYI there is a TCK test that verifies the InjectionPoint is null if
>     using getReference() outside custom bean's create:
>     org.jboss.cdi.tck.tests.lookup.injectionpoint.InjectionPointTest#testNullInjectionPointInjectedIntoNonInjectedObject()
> 
>     Martin
> 
>     [1]
>     http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#contextual_reference
> 
>     Dne 4.8.2017 v 13:05 Martin Kouba napsal(a):
>      > Hi John,
>      >
>      > Bean.getInjectionPoints() is only used during validation - returned
>      > injection points are validated at initialization time, so for a
>     custom
>      > bean it makes sense to return an empty set as there are no real
>      > injection points.
>      >
>      > WRT lookup - what exactly do you try to accomplish? Do you try to
>     obtain
>      > InjectionPoint metadata from inside a custom dependent bean's
>     create()
>      > method? This should be possible although not clearly specified. I
>     think
>      > we have a test with
>     BeanManager.getInjectableReference(InjectionPoint,
>      > CreationalContext<?>) but I will need to double check.
>      >
>      > I will also look at the geronimo-config repo.
>      >
>      > Martin
>      >
>      > Dne 4.8.2017 v 11:42 John D. Ament napsal(a):
>      >> Hi
>      >>
>      >> As the subject says.  I have a library that registers a custom
>      >> implementation of Bean, which has a method
>      >>
>      >>      @Override
>      >>      public Set<InjectionPoint> getInjectionPoints() {
>      >>          return Collections.emptySet();
>      >>      }
>      >>
>      >> When testing this on Weld3, I have code that looks up the injection
>      >> point, to find the annotations present.  However, the following
>      >> injection point lookup fails:
>      >>
>      >>      private static InjectionPoint findInjectionPoint(final
>      >> BeanManager bm, final CreationalContext<?> ctx) {
>      >>          return InjectionPoint.class.cast(
>      >> bm.getReference(bm.resolve(bm.getBeans(InjectionPoint.class)),
>      >> InjectionPoint.class, ctx));
>      >>      }
>      >>
>      >> so based on a CreationalContext I'm looking for InjectionPoint. 
>     Maybe
>      >> there's a different way that this is supposed to work?  If you're
>      >> interested in giving it a shot, take a look at
>      >> https://github.com/apache/geronimo-config and run the Weld3
>     profile to
>      >> replicate the issue.
>      >>
>      >> John
>      >>
>      >>
>      >> _______________________________________________
>      >> weld-dev mailing list
>      >> weld-dev at lists.jboss.org <mailto:weld-dev at lists.jboss.org>
>      >> https://lists.jboss.org/mailman/listinfo/weld-dev
>      >>
>      >
> 
>     --
>     Martin Kouba
>     Senior Software Engineer
>     Red Hat, Czech Republic
> 

-- 
Martin Kouba
Senior Software Engineer
Red Hat, Czech Republic


More information about the weld-dev mailing list