Hi,

When using byte[] as a parameter in a JAXWS-Style Webservice - example method-definition follows:

  @WebMethod(action = "addDocument")
  public void addDocument(
          @WebParam(name="docId") String docId,
@WebParam(name="documentData") byte[] documentData) throws DocumentServiceFault;

The array received by the client has the length 0.

I traced the problem back to org.apache.axis2.datasource.jaxb.JAXBDSContext's unmarshalArray(final XMLStreamReader reader, final Unmarshaller u, Class type)-Method, which tries to convert every Array-Object to a String-Array using the jaxb (version 2.1.7) unmarshaller.

This fails with byte-Arrays and returns a zero-byte String-Arrays, which leads to a call in the service, that has a zero-length byte-array, independent of what the client really sent.

I did a quick hack to make it work by changing the method to:

private static Object unmarshalArray(final XMLStreamReader reader, final Unmarshaller u, final Class type) throws Exception {
  try {
    if (DEBUG_ENABLED) {
      log.debug("Invoking unmarshalArray");
    }
    Object jaxb = AccessController.doPrivileged(new PrivilegedAction() {
      public Object run() {
        try {
          if(type == byte[].class)
            return u.unmarshal(reader, byte[].class);
          return u.unmarshal(reader, String[].class);
        } catch (OMException e) {
          throw e;
        } catch (Throwable t) {
          throw new OMException(t);
        }
      }
    });

    Object typeObj = getTypeEnabledObject(jaxb);

    // Now convert String Array in to the required Type Array.
    if (typeObj instanceof String[]) {
      String[] strArray = (String[]) typeObj;
      Object obj = XSDListUtils.fromStringArray(strArray, type);
      QName qName =
        XMLRootElementUtil.getXmlRootElementQNameFromObject(jaxb);
      jaxb = new JAXBElement(qName, type, obj);
    } else {
      QName qName =
        XMLRootElementUtil.getXmlRootElementQNameFromObject(jaxb);
      jaxb = new JAXBElement(qName, type, typeObj);
    }

    return jaxb;
  } catch (OMException e) {
    throw e;
  } catch (Throwable t) {
    throw new OMException(t);
  }
}


I hope this issue gets fixed somehow in future versions (Tested on Axis2 1.5).

Greetings,
Florian

Reply via email to