You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by bu...@apache.org on 2003/05/20 15:31:18 UTC

DO NOT REPLY [Bug 20059] New: - in Call.java JavaUtils.convert(long, long[]) fails to convert as expected

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20059>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20059

 in Call.java  JavaUtils.convert(long, long[]) fails to convert as expected

           Summary:  in Call.java  JavaUtils.convert(long, long[]) fails to
                    convert as expected
           Product: Axis
           Version: current (nightly)
          Platform: Other
        OS/Version: Other
            Status: NEW
          Severity: Major
          Priority: Other
         Component: Serialization/Deserialization
        AssignedTo: axis-dev@ws.apache.org
        ReportedBy: ed@mindreef.com


JDK 1.4 and up.
Used May 15, 2003 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: Call.java 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 );
    }

The result is a long not a long[]