axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Edward Wertz">
Subject Fatal Bug in JavaUtils.convert(long, long[]) fails
Date Fri, 16 May 2003 22:52:21 GMT
JDK 1.4 and up.
Used last nights build of Axis. 

The scenerio is that I'm using a Doc-Literal webservice.  In the return message I'm expecting
back a long[].  The problem comes in when the message has a single item in the array.  When
the message has an array of length > 1 the JavaUtils.convert is invoked to convert from
an ArrayList to long[].  When there is a single long in the message the JavaUtils.convert
is invoked to convert from long to long[].  The conversion is not happening from long to long[].
 I followed the axis code in my debugger and nowhere else is the long converted to a long[].
  My wsdl2java generated stub code is expecting a long[] from the call.invoke, but it is getting
a long back because it was not put inside of an array.  This causes a cast exception to occur.

It looks like the problem is that JavaUtils.convert doesn't make arrays out of single values.
 Tracing the convert function returns in a section of code saying there was no mapping between
the two types.  

This is the comment on the JavaUtils.convert function:

    /** Utility function to convert an Object to some desired Class.
     * Right now this works for:
     *     arrays <-> Lists,
     *     Holders <-> held values
     * @param arg the array to convert
     * @param destClass the actual class we want

This is the section of code that causes the convert function to return. 

        // Return if no conversion is available
        if (!(arg instanceof Collection ||
              (arg != null && arg.getClass().isArray())) &&
            ((destHeldType == null && argHeldType == null) ||
             (destHeldType != null && argHeldType != null))) {
            return arg;

The Axis Code: Line 2303 

    /** Invoke an RPC service with a pre-constructed RPCElement.
     * Note: Not part of JAX-RPC specification.
     * @param body an RPCElement containing all the information about
     *             this call.
     * @return a deserialized Java Object containing the return value
     * @exception AxisFault
    public Object invoke( RPCElement body ) throws AxisFault {

                // The following loop looks at the resargs and
                // converts the value to the appropriate return/out parameter
                // value.  If the return value is found, is value is
                // placed in result.  The remaining resargs are
                // placed in the outParams list (note that if a resArg
                // is found that does not match a operation parameter qname,
                // it is still placed in the outParms list).
                for (int i = outParamStart; i < resArgs.size(); i++) {
                    RPCParam param = (RPCParam) resArgs.get(i);

                    Class javaType = getJavaTypeForQName(param.getQName());
                    Object value = param.getValue();

                    // Convert type if needed
                    if (javaType != null && value != null &&
                           !javaType.isAssignableFrom(value.getClass())) {
-------->                 value = JavaUtils.convert(value, javaType);

Line 2365 
        // Convert type if needed
        if (operation != null && operation.getReturnClass() != null) {
-------->   result = JavaUtils.convert(result, operation.getReturnClass());  
        return( result );
View raw message