[cdi-dev] [JBoss JIRA] (CDI-178) Require container-provided InjectionTarget implementation to use getInjectionPoints()

Jozef Hartinger (Updated) (JIRA) jira-events at lists.jboss.org
Thu Oct 20 08:09:45 EDT 2011


     [ https://issues.jboss.org/browse/CDI-178?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jozef Hartinger updated CDI-178:
--------------------------------

    Description: 
A CDI extension should be able to turn a field of a into a CDI injection point as easily as by overriding the getInjectionPoints() method of the container-provided InjectionTarget implementation e.g.:

{code}
    event.setInjectionTarget(decorate(event.getInjectionTarget()));

...

    protected <T> InjectionTarget<T> decorate(final InjectionTarget<T> delegate)
    {
        return new ForwardingInjectionTarget<T>() {

            @Override
            public Set<InjectionPoint> getInjectionPoints() {
                Set<InjectionPoint> injectionPoints = new HashSet<InjectionPoint>();
                injectionPoints.addAll(super.getInjectionPoints());
                injectionPoints.addAll(); // additional injection points
                return injectionPoints;
            }

            @Override
            protected InjectionTarget<T> delegate() {
                return delegate;
            }
        };
    }
{code}

However, the spec does not require the container-provided InjectionTarget implementation to make use of the getInjectionPoint() method when creating a new instance. As a result, the approach above may or may not work.

Therefore, it is currently necessary for a portable extension to also provide an implementation of at least the inject() method (for field injection points) and implement the injection itself. This is problematic in 1.0 of the spec since a portable extension does not necessarily have access to the BeanManager instance of the BDA where the injection target is deployed, thus different visibility rules apply.

Clarify that the container-provided implementation of the Producer interface should use the result of the getInjectionPoints() method as a source of information about the injection points to inject.

  was:
A CDI extension should be able to turn a field of a into a CDI injection point as easily as by overriding the getInjectionPoints() method of the container-provided InjectionTarget implementation e.g.:

{code}
    event.setInjectionTarget(decorate(event.getInjectionTarget()));

...

    protected <T> InjectionTarget<T> decorate(final InjectionTarget<T> delegate)
    {
        return new ForwardingInjectionTarget<T>() {

            @Override
            public Set<InjectionPoint> getInjectionPoints() {
                Set<InjectionPoint> injectionPoints = new HashSet<InjectionPoint>();
                injectionPoints.addAll(super.getInjectionPoints());
                injectionPoints.addAll(); // additional injection points
                return injectionPoints;
            }

            @Override
            protected InjectionTarget<T> delegate() {
                return delegate;
            }
        };
    }
{code}

However, the spec does not require the container-provided InjectionTarget implementation to make use of the getInjectionPoint() method when creating a new instance. As a result, the approach above may or may not work.

Therefore, it is currently necessary for a portable extension to also provide an implementation of at least the inject() method (for field injection points) and implement the injection itself. This is problematic in 1.0 of the spec since a portable does not necessarily have access to the BeanManager instance of the BDA where the injection target is deployed, thus different visibility rules apply.

Clarify that the container-provided implementation of the Producer interface should use the result of the getInjectionPoints() method as a source of information about the injection points to inject.


    
> Require container-provided InjectionTarget implementation to use getInjectionPoints()
> -------------------------------------------------------------------------------------
>
>                 Key: CDI-178
>                 URL: https://issues.jboss.org/browse/CDI-178
>             Project: CDI Specification Issues
>          Issue Type: Feature Request
>          Components: Portable Extensions
>    Affects Versions: 1.0
>            Reporter: Jozef Hartinger
>            Priority: Minor
>             Fix For: 1.1 (Proposed)
>
>
> A CDI extension should be able to turn a field of a into a CDI injection point as easily as by overriding the getInjectionPoints() method of the container-provided InjectionTarget implementation e.g.:
> {code}
>     event.setInjectionTarget(decorate(event.getInjectionTarget()));
> ...
>     protected <T> InjectionTarget<T> decorate(final InjectionTarget<T> delegate)
>     {
>         return new ForwardingInjectionTarget<T>() {
>             @Override
>             public Set<InjectionPoint> getInjectionPoints() {
>                 Set<InjectionPoint> injectionPoints = new HashSet<InjectionPoint>();
>                 injectionPoints.addAll(super.getInjectionPoints());
>                 injectionPoints.addAll(); // additional injection points
>                 return injectionPoints;
>             }
>             @Override
>             protected InjectionTarget<T> delegate() {
>                 return delegate;
>             }
>         };
>     }
> {code}
> However, the spec does not require the container-provided InjectionTarget implementation to make use of the getInjectionPoint() method when creating a new instance. As a result, the approach above may or may not work.
> Therefore, it is currently necessary for a portable extension to also provide an implementation of at least the inject() method (for field injection points) and implement the injection itself. This is problematic in 1.0 of the spec since a portable extension does not necessarily have access to the BeanManager instance of the BDA where the injection target is deployed, thus different visibility rules apply.
> Clarify that the container-provided implementation of the Producer interface should use the result of the getInjectionPoints() method as a source of information about the injection points to inject.

--
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 cdi-dev mailing list