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 Ias <ia...@apache-korea.org> on 2003/05/16 13:56:55 UTC

[PATCH] more kindness to samples

>From Axis installation instruction
(http://cvs.apache.org/viewcvs.cgi/~checkout~/xml-axis/java/docs/install
.html) I found that the current taskdefs_post_compile.xml in xmls and
build.xml in samples/stock are a little inconvenient and hence necessary
to modify in order to deploy and run by Ant. The attached patches are
updated so that users may simply run "ant deploy", "ant run", and "ant
undeploy" with no additional works.
 
Thanks,
 
Ias.
 
===========================================================
Lee, Changshin (Korean name)
Ias (International name)
               Company Web Site: http://www.tmax.co.kr
               Personal Web Site: http://www.iasandcb.pe.kr
---------------------------------------------------------
Senior Researcher, Emerging Technology Evangelist & JCP Activities
Coordinator 
JCP member - http://jcp.org/en/participation/members/L
R&D Institute
Tmax Soft, Inc. 
JCP member - http://jcp.org/en/participation/members/T
==========================================================
 

Fatal Bug in Call.java JavaUtils.convert(long, long[]) fails

Posted by Edward Wertz <ed...@mindreef.com>.
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: 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 );
    }