done *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]> > Thanks. > > While you're correcting things, could you fix the typo in the message > "Ambigious resolution". > > Another thing that bothers me is that the parameterized types information > is "stripped" in the AbstractOwbBean.toString(). > > If you look at my example, you will see: > > API Types:[java.lang.Object,test.StringToLongConverter,test.TypeConverter] > > I would like to see: > > API > Types:[java.lang.Object,test.StringToLongConverter,test.TypeConverter<String, > Long>] > > At first, I thought Bean.getTypes() only returned raw classes instead of > more general Types. But that wasn't the case, it's just the toString() > method that strips the parameterized information. > > Xavier > > ________________________________ > > From: [email protected] > > Date: Tue, 19 Mar 2013 11:34:16 +0100 > > Subject: Re: CDI and ParameterizedTypes > > To: [email protected] > > > > 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/ > > LinkedIn: http://fr.linkedin.com/in/rmannibucau > > Github: https://github.com/rmannibucau > > > > > > > > 2013/3/19 Romain Manni-Bucau > > <[email protected]<mailto:[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/ > > LinkedIn: http://fr.linkedin.com/in/rmannibucau > > Github: https://github.com/rmannibucau > > > > > > > > 2013/3/19 Xavier Dury <[email protected]<mailto:[email protected]>> > > Sure, here it is: > https://dl.dropbox.com/u/908875/openwebbeans/converters.zip > > > > Xavier > > > > ________________________________ > > > From: [email protected]<mailto:[email protected]> > > > Date: Tue, 19 Mar 2013 09:53:43 +0100 > > > Subject: Re: CDI and ParameterizedTypes > > > To: [email protected]<mailto:[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]><mailto:[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]><mailto:[email protected] > <mailto:[email protected]>> > > > > Subject: Re: CDI and ParameterizedTypes > > > > To: > > [email protected]<mailto:[email protected] > ><mailto:[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]><mailto: > [email protected]<mailto:[email protected]>>> > > > > To: > > [email protected]<mailto:[email protected] > ><mailto:[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]>><mailto:[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]>><mailto: > [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] > >><mailto:[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] > >>><mailto:[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 > > > > > > > > > > > > > > > > > > > > > > > > >
