[ 
https://issues.apache.org/jira/browse/OWB-431?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12893656#action_12893656
 ] 

Bill Wigger commented on OWB-431:
---------------------------------

Bc  extends Dc.

Problem is the current code is checking  this:

claxxTvBound is Bc,  clazzRequiredType is Dc.

if(!clazzTvBound.isAssignableFrom(clazzRequiredType))
                {
                    return false;
                }       

so the means return false   if  the "not"  of   Bc.isAssignableFrom(Dc).
So  Bc is not assignable from Dc (since  Bc extends Dc),  so   that logic 
returns false, which gets inverted to true, and therefore the routine returns 
false.
But, since Bc (the bean type)  extends Dc (the required type),  it should have 
returned true.

> Generic Type Inheritance not resolved correctly
> -----------------------------------------------
>
>                 Key: OWB-431
>                 URL: https://issues.apache.org/jira/browse/OWB-431
>             Project: OpenWebBeans
>          Issue Type: Bug
>          Components: Injection and Lookup
>    Affects Versions: 1.0.0-alpha-1
>         Environment: standard OWB configuration
>            Reporter: Bill Wigger
>            Assignee: Gurkan Erdogdu
>            Priority: Minor
>             Fix For: 1.0.0-alpha-2
>
>         Attachments: ClassUtilPatch.txt, ClassUtilPatch2.txt
>
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> WebBean is defined as:
> @Named
> public class MethodTypeProduces1<T extends Bc> {
>       @Produces @Dependent @Named("ProMethodParameterized3") ArrayList<T> 
> methodPT3() {
> and injected as:
> @Named
> @Dependent
> public class ProMethodTestGroup3A {
>       public @Inject @Dependent @Named("ProMethodParameterized3") 
> ArrayList<Dc> pt3;
>         
> with BC extending DC as follows:
> public class Bc extends Dc implements Fi {
> gives this error:
> Jul 28, 2010 9:26:51 AM org.apache.webbeans.config.BeansDeployer deploy
> SEVERE: 
> Throwable occurred: javax.enterprise.inject.UnsatisfiedResolutionException: 
> Api type [java.util.ArrayList] is not found with the qualifiers 
> [...@javax.inject.named(value=ProMethodParameterized3)] for injection into 
> Field Injection Point, field name :  pt3, Bean Owner : 
> [Name:proMethodTestGroup3A,WebBeans Type:MANAGED,API 
> Types:[com.ibm.jcdi.test.ProMethodTestGroup3A,java.lang.Object],Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default,javax.inject.Named]]
>       at 
> org.apache.webbeans.container.ResolutionUtil.checkResolvedBeans(ResolutionUtil.java:121)
>       at 
> org.apache.webbeans.container.InjectionResolver.checkInjectionPoints(InjectionResolver.java:185)
>       at 
> org.apache.webbeans.container.BeanManagerImpl.validate(BeanManagerImpl.java:1025)
> injection should be checked/resolved here in 
> org.apache.webbeans.util.ClassUtil,  but this method returns false
>     public static boolean checkRequiredTypeIsClassAndBeanTypeIsVariable(Type 
> beanTypeArg, Type requiredTypeArg)
>     {
>         Class<?> clazzRequiredType = (Class<?>)requiredTypeArg;
>         TypeVariable<?> tvBeanTypeArg = (TypeVariable<?>)beanTypeArg;
>         Type tvBound = tvBeanTypeArg.getBounds()[0];
>         if(tvBound instanceof Class)
>         {
>             Class<?> clazzTvBound = (Class<?>)tvBound;
>             if(clazzTvBound != Object.class)
>             {
>                 if(!clazzTvBound.isAssignableFrom(clazzRequiredType))
>                 {
>                     return false;
>                 }                                    
>             }            
>         }
>         return true;
>     }
> But since clazzTvBound is Bc  and classRequiredType is Dc
> Bc.isAssignableFrom(Dc) returns false,  so the ! is true,  and the function 
> returns false.
> fix seems to simply go back to the old code in this routine, this code was 
> changeed on 4/28, and
> I can't see why is was changed.
> But the check needs to verify that the required class can be assigned from 
> the given bean class, as follows:
>         if(tvBound instanceof Class)
>         {
>             Class<?> clazzTvBound = (Class<?>)tvBound;
>             if(clazzRequiredType.isAssignableFrom(clazzTvBound))
>             {
>                 return true;
>             }                    
>         }
>         return false;
> There is also a similar incorrect injection exception using the above 
> example, but with an injection of:
> public class TG4 <T extends Dc> {
>       public @Inject @Dependent @Named("ProMethodParameterized3") 
> ArrayList<T> ptT;
> I think the line of code in error here is in the method: 
> (same class as in the previous problem: org.apache.webbeans.util.ClassUtil)
> public static boolean checkBeanTypeAndRequiredIsTypeVariable(Type 
> beanTypeArg, Type requiredTypeArg)
> where:    
> if(clazzTvBeanBound.isAssignableFrom(clazzTvRequiredBound))
> should be replaced with:
> (clazzTvRequiredBound.isAssignableFrom(clazzTvBeanBound))

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to