FYI: https://issues.apache.org/jira/browse/OWB-791

i'll backport it over 1.1.x branch pretty soon

*Romain Manni-Bucau*
*Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
*Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/>
*LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
*Github: https://github.com/rmannibucau*



2013/3/19 Romain Manni-Bucau <[email protected]>

> Thanks,
>
> that's an issue: OWB only tolerates one generic
>
> patching 
> org.apache.webbeans.util.ClassUtil#isAssignableForParametrizedCheckArguments
> this way should make it work:
>
> private static boolean isAssignableForParametrizedCheckArguments(Type[]
> beanTypeArgs, Type[] requiredTypeArgs)
>     {
>         Type requiredTypeArg = null;
>         Type beanTypeArg = null;
>         int ok = 0;
>         for(int i = 0; i< requiredTypeArgs.length;i++)
>         {
>             requiredTypeArg = requiredTypeArgs[i];
>             beanTypeArg = beanTypeArgs[i];
>
>             //Required type is parametrized and bean type is parametrized
>             if(ClassUtil.isParametrizedType(requiredTypeArg) &&
> ClassUtil.isParametrizedType(beanTypeArg))
>             {
>                 if (checkBeanAndRequiredTypeIsParametrized(beanTypeArg,
> requiredTypeArg))
>                 {
>                     ok++;
>                 }
>             }
>             //Required type is wildcard
>             else if(ClassUtil.isWildCardType(requiredTypeArg))
>             {
>                 if (checkRequiredTypeIsWildCard(beanTypeArg,
> requiredTypeArg))
>                 {
>                     ok++;
>                 }
>             }
>             //Required type is actual type and bean type is type variable
>             else if(requiredTypeArg instanceof Class &&
> ClassUtil.isTypeVariable(beanTypeArg))
>             {
>                 if
> (checkRequiredTypeIsClassAndBeanTypeIsVariable(beanTypeArg,
> requiredTypeArg))
>                 {
>                     ok++;
>                 }
>             }
>             //Required type is Type variable and bean type is type variable
>             else if(ClassUtil.isTypeVariable(requiredTypeArg) &&
> ClassUtil.isTypeVariable(beanTypeArg))
>             {
>                 if ( checkBeanTypeAndRequiredIsTypeVariable(beanTypeArg,
> requiredTypeArg))
>                 {
>                     ok++;
>                 }
>             }
>
>             //Both type is actual type
>             else if((beanTypeArg instanceof Class) && (requiredTypeArg
> instanceof Class))
>             {
>
> if(isClassAssignable((Class<?>)requiredTypeArg,(Class<?>)beanTypeArg))
>                 {
>                     ok++;
>                 }
>             }
>             //Bean type is actual type and required type is type variable
>             else if((beanTypeArg instanceof Class) &&
> (ClassUtil.isTypeVariable(requiredTypeArg)))
>             {
>                 if
> (checkRequiredTypeIsTypeVariableAndBeanTypeIsClass(beanTypeArg,
> requiredTypeArg))
>                 {
>                     ok++;
>                 }
>             }
>         }
>
>         return ok == requiredTypeArgs.length;
>     }
>
> *Romain Manni-Bucau*
> *Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
> *Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/>
> *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
> *Github: https://github.com/rmannibucau*
>
>
>
> 2013/3/19 Xavier Dury <[email protected]>
>
>> Sure, here it is:
>> https://dl.dropbox.com/u/908875/openwebbeans/converters.zip
>>
>> Xavier
>>
>> ________________________________
>> > From: [email protected]
>> > Date: Tue, 19 Mar 2013 09:53:43 +0100
>> > Subject: Re: CDI and ParameterizedTypes
>> > To: [email protected]
>> >
>> > do you have a sample reproducing it?
>> >
>> > Romain Manni-Bucau
>> > Twitter: @rmannibucau<https://twitter.com/rmannibucau>
>> > Blog: http://rmannibucau.wordpress.com/
>> > LinkedIn: http://fr.linkedin.com/in/rmannibucau
>> > Github: https://github.com/rmannibucau
>> >
>> >
>> >
>> > 2013/3/19 Xavier Dury <[email protected]<mailto:[email protected]>>
>> > Hi,
>> >
>> > I still got the same error with 1.1.8-SNAPSHOT:
>> >
>> > javax.enterprise.inject.AmbiguousResolutionException: Ambigious
>> resolution
>> > found beans:
>> > StringToLongConverter, Name:null, WebBeans Type:MANAGED, API
>> > Types:[java.lang.Object,test.StringToLongConverter,test.TypeConverter],
>> > Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]
>> > StringToIntegerConverter, Name:null, WebBeans Type:MANAGED, API
>> >
>> Types:[test.TypeConverter,java.lang.Object,test.StringToIntegerConverter],
>> > Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]
>> > at
>> >
>> org.apache.webbeans.util.InjectionExceptionUtils.throwAmbiguousResolutionExceptionForBeans(InjectionExceptionUtils.java:121)
>> > at
>> >
>> org.apache.webbeans.util.InjectionExceptionUtils.throwAmbiguousResolutionException(InjectionExceptionUtils.java:111)
>> > at
>> >
>> org.apache.webbeans.util.InjectionExceptionUtils.throwAmbiguousResolutionException(InjectionExceptionUtils.java:88)
>> > at
>> >
>> org.apache.webbeans.container.InjectionResolver.resolve(InjectionResolver.java:669)
>> > at
>> >
>> org.apache.webbeans.container.InjectionResolver.checkInjectionPoints(InjectionResolver.java:189)
>> > at
>> >
>> org.apache.webbeans.container.BeanManagerImpl.validate(BeanManagerImpl.java:1034)
>> > at
>> > org.apache.openejb.cdi.BeansDeployer.validate(BeansDeployer.java:269)
>> > at
>> >
>> org.apache.openejb.cdi.BeansDeployer.validateInjectionPoints(BeansDeployer.java:222)
>> > at
>> >
>> org.apache.openejb.cdi.OpenEJBLifecycle.startApplication(OpenEJBLifecycle.java:280)
>> > ... 46 more
>> >
>> > Xavier
>> > ________________________________
>> > > Date: Fri, 15 Mar 2013 15:54:37 +0000
>> > > From: [email protected]<mailto:[email protected]>
>> > > Subject: Re: CDI and ParameterizedTypes
>> > > To: [email protected]<mailto:[email protected]>
>> > >
>> > > romain, Xavier, can you please test with the latest 1.1.8-SNAPSHOT?
>> > >
>> > > I'll roll a 1.1.8 release this evening.
>> > >
>> > > LieGrue,
>> > > strub
>> > >
>> > >
>> > > ________________________________
>> > > From: Romain Manni-Bucau
>> > <[email protected]<mailto:[email protected]>>
>> > > To: [email protected]<mailto:[email protected]>
>> > > Sent: Friday, March 15, 2013 4:17 PM
>> > > Subject: Re: CDI and ParameterizedTypes
>> > >
>> > > Ok
>> > >
>> > > guess the fix was not in
>> > >
>> > >
>> > > Romain Manni-Bucau
>> > > Twitter: @rmannibucau<https://twitter.com/rmannibucau>
>> > > Blog: http://rmannibucau.wordpress.com/
>> > > LinkedIn: http://fr.linkedin.com/in/rmannibucau
>> > > Github: https://github.com/rmannibucau
>> > >
>> > >
>> > >
>> > > 2013/3/15 Xavier Dury
>> > <[email protected]<mailto:[email protected]><mailto:
>> [email protected]<mailto:[email protected]>>>
>> > > Hi,
>> > >
>> > > I'm using the last version available on maven central repo which is
>> 1.1.7.
>> > >
>> > > Xavier
>> > >
>> > > ________________________________
>> > > > From:
>> > [email protected]<mailto:[email protected]><mailto:
>> [email protected]<mailto:[email protected]>>
>> > > > Date: Fri, 15 Mar 2013 15:29:00 +0100
>> > > > Subject: Re: CDI and ParameterizedTypes
>> > > > To:
>> > [email protected]<mailto:[email protected]
>> ><mailto:[email protected]<mailto:[email protected]
>> >>
>> > > >
>> > > > Hi,
>> > > >
>> > > > if i didn't miss it you didn't mention your version
>> > > >
>> > > > think it should work with 1.1.8
>> > > >
>> > > > https://github.com/rmannibucau/cdi-converters was used to work and
>> was
>> > > > using something
>> > > > close
>> > >
>> >
>> https://github.com/rmannibucau/cdi-converters/blob/master/src/test/java/com/github/rmannibucau/converter/ConverterTest.java
>> > > >
>> > > > Romain Manni-Bucau
>> > > > Twitter: @rmannibucau<https://twitter.com/rmannibucau>
>> > > > Blog: http://rmannibucau.wordpress.com/
>> > > > LinkedIn: http://fr.linkedin.com/in/rmannibucau
>> > > > Github: https://github.com/rmannibucau
>> > > >
>> > > >
>> > > >
>> > > > 2013/3/15 Xavier Dury
>> > >
>> > <[email protected]<mailto:[email protected]><mailto:
>> [email protected]<mailto:[email protected]>><mailto:[email protected]
>> <mailto:[email protected]><mailto:[email protected]<mailto:
>> [email protected]>>>>
>> > > > Hi,
>> > > >
>> > > > I'm trying to implement a simple type conversion framework in CDI.
>> > > > Typically, you can either implement the TypeConverter interface or
>> > > > annotate some methods in your beans:
>> > > >
>> > > > public interface TypeConverter<S, T> {
>> > > >
>> > > > T convert(S source);
>> > > > }
>> > > >
>> > > > public class StringToIntegerTypeConverter implements
>> > > > TypeConverter<String, Integer> { ... }
>> > > >
>> > > > public class StringToLongTypeConverter implements
>> TypeConverter<String,
>> > > > Long> { ... }
>> > > >
>> > > > public MyConverters {
>> > > >
>> > > > @Converts public Integer stringToInteger(String value) { ... }
>> > > > @Converts public Long stringToLong(String value) { ... }
>> > > > }
>> > > >
>> > > > A specific Extension "bridges" the annotated methods to a full
>> > > > TypeConverter (a custom Bean<?> is registered with an API types of
>> > > > ParameterizedTypeImpl(rawType = TypeConverter.class, ownerType =
>> null,
>> > > > actualTypeArguments = [method.getGenericParameterType[0],
>> > > > method.getGenericReturnType])).
>> > > >
>> > > > Then a TypeConversionService is responsible to find the adequate
>> > > > Converter through the BeanManager and call it with the provided
>> object
>> > > > to be converted.
>> > > >
>> > > > public class TypeConversionService {
>> > > >
>> > > > public <T> T convert(Class<T> targetType, Object source) { ... }
>> > > > public <T> T convert(TypeLiteral<T> targetTypeLiteral, Object
>> source)
>> > > { ... }
>> > > > }
>> > > >
>> > > > My problem is the following: as soon as 2 or more TypeConverters are
>> > > > present in the module (let's say StringToIntegerTypeConverter and
>> > > > StringToLongTypeConverter), an ambiguous dependency exception is
>> > > > thrown.
>> > > >
>> > > > For example:
>> > > >
>> > > > public class MyBean {
>> > > >
>> > > > @Inject TypeConverter<String, Integer> stringToIntegerTypeConverter;
>> > > > @Inject TypeConverter<String, Long> stringToLongTypeConverter;
>> > > >
>> > > > // won't work
>> > > > }
>> > > >
>> > > > If I delete one of the TypeConverter classes
>> (StringToLongTypeConverter
>> > > > for example), the remaining TypeConverter
>> > > > (StringToIntegerTypeConverter) is injected at the 2 injection points
>> > > > (stringToIntegerTypeConverter=ok and stringToLongTypeConverter=!ok).
>> > > >
>> > > > Is it possible with CDI to have such a scenario without using
>> > > > additional qualifiers to qualify each converter and only rely on the
>> > > > (parameterized) type information to tell them apart?
>> > > >
>> > > > I've seen some discussions on StackOverflow saying the TypeConverter
>> > > > should belong to the Dependent scope but it didn't work for me.
>> > > >
>> > > > Thanks,
>> > > >
>> > > > Xavier
>> > > >
>> > >
>> > >
>> > >
>> >
>>
>
>

Reply via email to