Axis is not honoring the useSOAPAction to invoke services
---------------------------------------------------------

         Key: AXIS-1977
         URL: http://issues.apache.org/jira/browse/AXIS-1977
     Project: Axis
        Type: Bug
  Components: Serialization/Deserialization  
    Versions: 1.2RC3    
    Reporter: Jim Peterson


If multiple methods are declared in the wsdl with the same signature, Axis 
cannot resolve the correct method to call and just picks the first method with 
a matching signature even though the message delares that useSOAPAction = true 
and a SOAPAction is specified.

To get around this limitation, I modified the deserialize() method of 
org.apache.axis.message.RPCElement to check for the useSOAPAction parameter and 
match the method name to the SOAPAction if useSOAPAction = true.  Here's the 
code snippet:

    public void deserialize() throws SAXException
    {
        needDeser = false;

        MessageContext msgContext = context.getMessageContext();

        // Figure out if we should be looking for out params or in params
        // (i.e. is this message a response?)
        Message msg = msgContext.getCurrentMessage();
        SOAPConstants soapConstants = msgContext.getSOAPConstants();

        boolean isResponse = ((msg != null) &&
                              Message.RESPONSE.equals(msg.getMessageType()));

        // We're going to need this below, so create one.
        RPCHandler rpcHandler = new RPCHandler(this, isResponse);

        if (operations != null) {
            int numParams = (getChildren() == null) ? 0 : getChildren().size();

            SAXException savedException = null;

            // By default, accept missing parameters as nulls, and
            // allow the message context to override.
            boolean acceptMissingParams = msgContext.isPropertyTrue(
                    MessageContext.ACCEPTMISSINGPARAMS,
                    true);

            // We now have an array of all operations by this name.  Try to
            // find the right one.  For each matching operation which has an
            // equal number of "in" parameters, try deserializing.  If we
            // don't succeed for any of the candidates, punt.

            for (int i = 0; i < operations.length; i++) {
                OperationDesc operation = operations[i];

/*********************************************************************/
/****       Recommened change to support the use of SOAP Action   ****/
/*********************************************************************/


                // Check if the SOAP Action URI is to be used.
                //if so, ensure the current operation matches before processing 
it
                if (msgContext.useSOAPAction()) {
                    String soapActionURI = msgContext.getSOAPActionURI();
                    String operationName = operation.getName();
                    if (!(operationName.equals(soapActionURI))) {
                        continue;
                    }
                }

/*********************************************************************/
/*********************************************************************/



                // See if any information is coming from a header
                boolean needHeaderProcessing =
                    needHeaderProcessing(operation, isResponse);
                                :
                                :

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to