Uploaded image for project: 'OpenWebBeans'
  1. OpenWebBeans
  2. OWB-431

Generic Type Inheritance not resolved correctly

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • 1.0.0-alpha-1
    • 1.0.0-alpha-2
    • Injection and Lookup
    • None
    • standard OWB configuration

    Description

      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))

      Attachments

        1. ClassUtilPatch2.txt
          2 kB
          Bill Wigger
        2. ClassUtilPatch.txt
          1 kB
          Bill Wigger

        Activity

          People

            gerdogdu Gurkan Erdogdu
            billwigger Bill Wigger
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - 2h
                2h
                Remaining:
                Remaining Estimate - 2h
                2h
                Logged:
                Time Spent - Not Specified
                Not Specified