You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Colin Markwell <co...@gmail.com> on 2007/03/09 17:36:10 UTC

[Axis2] SOAP faults problem with InOnly Receiver

Hi,

I'm having problems returning SOAP faults from Axis2/Java 1.1.1 when
using methods that use the InOnly receiver (i.e. ones that don't
return any data).

Instead of retuning a "HTTP/1.1 500 Internal Server Error" response,
it returns "HTTP/1.1 202 Accepted".

I believe that the 500 response is correct:

"In case of a SOAP error while processing the request, the SOAP HTTP
server MUST issue an HTTP 500 "Internal Server Error" response and
include a SOAP message in the response containing a SOAP Fault element
(see section 4.4) indicating the SOAP processing error."
http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383529

To demonstrate I've created some WSDL that has two methods - one that
doesn't return any data ("in"), and one that does ("inout"):

--- Begin test.wsdl -----------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
        xmlns:tns="http://www.example.org/test/"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="test"
        targetNamespace="http://www.example.org/test/">

        <wsdl:types>
                <xsd:schema targetNamespace="http://www.example.org/test/">
                        <xsd:element name="in" type="xsd:string" />
                        <xsd:element name="inout" type="xsd:string" />
                        <xsd:element name="inoutResponse" type="xsd:string" />
                </xsd:schema>
        </wsdl:types>

        <wsdl:message name="inRequest">
                <wsdl:part name="parameters" element="tns:in" />
        </wsdl:message>
        <wsdl:message name="inoutRequest">
                <wsdl:part name="inoutRequest" element="tns:inout" />
        </wsdl:message>
        <wsdl:message name="inoutResponse">
                <wsdl:part name="parameters" element="tns:inoutResponse" />
        </wsdl:message>

        <wsdl:portType name="test">
                <wsdl:operation name="in">
                        <wsdl:input message="tns:inRequest"></wsdl:input>
                </wsdl:operation>
                <wsdl:operation name="inout">
                        <wsdl:input message="tns:inoutRequest"></wsdl:input>
                        <wsdl:output message="tns:inoutResponse"></wsdl:output>
                </wsdl:operation>
        </wsdl:portType>

        <wsdl:binding name="testSOAP" type="tns:test">
                <soap:binding style="document"
                        transport="http://schemas.xmlsoap.org/soap/http" />
                <wsdl:operation name="in">
                        <soap:operation
soapAction="http://www.example.org/test/in" />
                        <wsdl:input>
                                <soap:body use="literal" />
                        </wsdl:input>
                </wsdl:operation>
                <wsdl:operation name="inout">
                        <soap:operation

soapAction="http://www.example.org/test/inout" />
                        <wsdl:input>
                                <soap:body use="literal" />
                        </wsdl:input>
                        <wsdl:output>
                                <soap:body use="literal" />
                        </wsdl:output>
                </wsdl:operation>
        </wsdl:binding>

        <wsdl:service name="test">
                <wsdl:port binding="tns:testSOAP" name="testSOAP">
                        <soap:address location="http://www.example.org/" />
                </wsdl:port>
        </wsdl:service>

</wsdl:definitions>

--- End test.wsdl -------------------------------------------------------

I then create the Java classes from the WSDL:

wsdl2java -uri test.wsdl -ss -sd

I then populate the skeleton class with code that throws AxisFaults:

--- Begin src/org/example/www/test/TestSkeleton.java --------------------

package org.example.www.test;

import org.apache.axis2.AxisFault;

public class TestSkeleton{

        public InoutResponse inout(Inout param0) throws AxisFault {
                throw new AxisFault("Inout AxisFault");
        }

        public  void in(In param2) throws AxisFault {
                throw new AxisFault("In AxisFault");
        }
}

--- End src/org/example/www/test/TestSkeleton.java ----------------------

I then build the aar file using ant and the wsdl2java-created
build.xml and deploy it to my Tomcat 5.0.28 server.

I then use Eclipse's Web Services Explorer to invoke the web service,
proxying the requests through Apache TCPMon so that I can view the
headers.

These are the responses I see:

--- Begin response to "inout" SOAP message ------------------------------

HTTP/1.1 500 Internal Server Error
Content-Type: text/xml;charset=utf-8
Date: Fri, 09 Mar 2007 14:23:47 GMT
Server: Apache-Coyote/1.1
Connection: close

<?xml version='1.0' encoding='utf-8'?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Header />
      <soapenv:Body>
         <soapenv:Fault>
            <faultcode>soapenv:Client</faultcode>
            <faultstring>Inout AxisFault</faultstring>
            <detail />
         </soapenv:Fault>
      </soapenv:Body>
   </soapenv:Envelope>

--- End response to "inout" SOAP message --------------------------------

--- Begin response to "in" SOAP message ---------------------------------

HTTP/1.1 202 Accepted
Content-Type: text/xml;charset=utf-8
Date: Fri, 09 Mar 2007 14:20:11 GMT
Server: Apache-Coyote/1.1
Connection: close

<?xml version='1.0' encoding='utf-8'?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Header />
      <soapenv:Body>
         <soapenv:Fault>
            <faultcode>soapenv:Client</faultcode>
            <faultstring>In AxisFault</faultstring>
            <detail />
         </soapenv:Fault>
      </soapenv:Body>
   </soapenv:Envelope>

--- End response to "in" SOAP message -----------------------------------

Am I doing something wrong, or is this a bug?

A separate issue, I think, but I also see an exception in my Tomcat
log when a 500 response is returned:

org.apache.catalina.core.StandardHostValve@15ad1da: Exception
Processing ErrorPage[errorCode=500,
location=/axis2-web/Error/error500.jsp]
java.lang.IllegalStateException
	at org.apache.coyote.Response.reset(Response.java:296)

Is this Axis erroneously trying to return "error500.jsp" after the
SOAP response has already been sent (i.e. too late)?

Thank you.

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org