Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-1587

Aegis Databinding cannot handle wildcard as a Map value type (ex: Map<String, ?>)

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.1
    • Fix Version/s: 2.1.1
    • Component/s: Aegis Databinding
    • Labels:
      None
    • Environment:

      Java 1.5.0_10; Windows

      Description

      If an interface conatins a method which takes a param of type Map<String, ?> or returns a Map<String, ?> the following exception occurs with the following code:

      ServerFactoryBean svrFactory = new ServerFactoryBean();
      svrFactory.setServiceClass(Tester.class);
      svrFactory.setAddress("http://localhost:9090/cxfbug");
      svrFactory.setServiceBean(new TesterImpl());
      svrFactory.getServiceFactory().setDataBinding(new AegisDatabinding());
      svrFactory.create();

      Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
      at org.apache.cxf.aegis.type.java5.Java5TypeCreator.getComponentType(Java5TypeCreator.java:184)
      at org.apache.cxf.aegis.type.java5.Java5TypeCreator.getOrCreateParameterizedType(Java5TypeCreator.java:134)
      at org.apache.cxf.aegis.type.java5.Java5TypeCreator.getOrCreateMapValueType(Java5TypeCreator.java:130)
      at org.apache.cxf.aegis.type.AbstractTypeCreator.getOrCreateMapValueType(AbstractTypeCreator.java:254)
      at org.apache.cxf.aegis.type.XMLTypeCreator.getOrCreateMapValueType(XMLTypeCreator.java:514)
      at org.apache.cxf.aegis.type.AbstractTypeCreator.createMapType(AbstractTypeCreator.java:268)
      at org.apache.cxf.aegis.type.AbstractTypeCreator.createTypeForClass(AbstractTypeCreator.java:111)
      at org.apache.cxf.aegis.databinding.AegisDatabinding.getParameterType(AegisDatabinding.java:593)
      at org.apache.cxf.aegis.databinding.AegisDatabinding.initializeMessage(AegisDatabinding.java:375)
      at org.apache.cxf.aegis.databinding.AegisDatabinding.initializeOperation(AegisDatabinding.java:339)
      at org.apache.cxf.aegis.databinding.AegisDatabinding.initialize(AegisDatabinding.java:303)
      at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:343)
      at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:394)
      at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:180)
      at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:79)
      at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:114)

      If you do not use the Aegis Databinding then the code works as expected.
      The problem seems to stem from the org.apache.cxf.aegis.type.java5.Java5TypeCrestor class in the following method:
      protected Class getComponentType(Object genericType, int index) {
      Class paramClass = null;

      if (genericType instanceof ParameterizedType) {
      ParameterizedType type = (ParameterizedType)genericType;

      if (type.getActualTypeArguments()[index] instanceof Class)

      { paramClass = (Class)type.getActualTypeArguments()[index]; }

      else if (type.getActualTypeArguments()[index] instanceof WildcardType) {
      WildcardType wildcardType = (WildcardType)type.getActualTypeArguments()[index];

      if (wildcardType.getUpperBounds()[index] instanceof Class)

      { paramClass = (Class)wildcardType.getUpperBounds()[index]; }
      } else if (type.getActualTypeArguments()[index] instanceof ParameterizedType) { ParameterizedType ptype = (ParameterizedType)type.getActualTypeArguments()[index]; paramClass = (Class)ptype.getRawType(); }
      }
      return paramClass;
      }

      I found if I change
      if (wildcardType.getUpperBounds()[index] instanceof Class) { paramClass = (Class)wildcardType.getUpperBounds()[index]; }

      to
      if (wildcardType.getUpperBounds()[0] instanceof Class)

      { paramClass = (Class)wildcardType.getUpperBounds()[0]; }

      it works in my case but not at all sure if this is the correct fix or if this should be expected to be supported.

        Attachments

          Activity

            People

            • Assignee:
              bmargulies Benson Margulies
              Reporter:
              brianga Brian Gadwell
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: