[cdi-dev] Easy way to get 'original' type from alternative producers

Martin Kouba mkouba at redhat.com
Thu Feb 15 04:57:04 EST 2018


Dne 13.2.2018 v 13:13 arjan tijms napsal(a):
> Hi,
> 
> When writing an alternative producer, e.g.
> 
> @Alternative
> @Priority(500)
> @ApplicationScoped
> public class ApplicationInit {
>      @Produces
>      public HttpAuthenticationMechanism produce(BeanManager beanManager) {
>          return ...
>      }
> }
> 
> You not rarely need the bean the producer is going to be an alternative 
> for. For instance to wrap it, or otherwise augment it, or perhaps to 
> take a few values from.

I think it could be a nice feature. Pls file a JIRA issue.
> 
> In order to get that bean, a bunch of quite verbose code is needed. I.e 
> I came up with:
> 
> HttpAuthenticationMechanism mechanism =
>      createRef(
>          beanManager.resolve(

This wouldn't work because BeanManager.resolve() attempts to resolve the 
ambiguities thus eliminate all non-alternative beans.

>              beanManager.getBeans(HttpAuthenticationMechanism.class)
>                         .stream()
>                         .filter(e -> 
> !e.getBeanClass().equals(ApplicationInit.class))
>                         .collect(toSet())),
>              beanManager);
> 
> 
> And:
> 
> HttpAuthenticationMechanism createRef(Bean<?> bean, BeanManager 
> beanManager) {
>      return (HttpAuthenticationMechanism)
>          beanManager.getReference(
>              bean,
>              HttpAuthenticationMechanism.class,
>              beanManager.createCreationalContext(bean));
> }
> 
> I wonder if it would not be a good idea to introduce something to get 
> that original bean more easily, i.e. just like a decorator and @Delegate.
> 
> E.g.
> 
> @Alternative
> @Priority(500)
> @ApplicationScoped
> public class ApplicationInit {
>      @Produces
>      public HttpAuthenticationMechanism produce(BeanManager beanManager, 
> HttpAuthenticationMechanism original) {

This would not work - you would need to distinguish the original 
injection point.

>          return ...
>      }
> }
> 
> Or reuse the @Delegate (perhaps with the @Alternative annotation)

-1 This might be confusing.

> 
> @Alternative
> @Priority(500)
> @ApplicationScoped
> public class ApplicationInit {
> 
>      @Inject
>      @Delegate
>      @Alternative (?)
>      private HttpAuthenticationMechanism original;
>      @Produces
>      public HttpAuthenticationMechanism produce(BeanManager beanManager) {
>          return ...
>      }
> }
> 
> Thoughts?
> 
> Kind regards,
> Arjan Tijms
> 
> 
> _______________________________________________
> cdi-dev mailing list
> cdi-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/cdi-dev
> 
> Note that for all code provided on this list, the provider licenses the code under the Apache License, Version 2 (http://www.apache.org/licenses/LICENSE-2.0.html). For all other ideas provided on this list, the provider waives all patent and other intellectual property rights inherent in such information.
> 

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


More information about the cdi-dev mailing list