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=13355>.
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=13355

Type info in body is validated even if use=literal

           Summary: Type info in body is validated even if use=literal
           Product: Axis
           Version: 1.0-rc2
          Platform: PC
        OS/Version: Other
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: Serialization/Deserialization
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


Axis 1.0 RC2 interprets type information in the soap body event if the
WSDL specifies use="literal". I don't think Axis should do that.
I think Axis should use the schema in the WSDL and ignore the
type information in the soap body. Anyway, that is what .NET does.

Here is an example.

My SOAP server takes a request like this:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
  xmlns:xsd="http://www.w3.org/2001/XMLSchema";
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
 <soapenv:Body>
  <RequestAllConfigurations xmlns="my.namespace.se"/>
 </soapenv:Body>
</soapenv:Envelope>

And generates a response like this:

<?xml version="1.0" encoding="iso-8859-1"?>
<SOAP-ENV:Envelope xmlns="my.namespace.se" xmlns:DAB="my.namespace.se"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema";
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";>
 <SOAP-ENV:Header/>
 <SOAP-ENV:Body xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/";
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";>
  <AllConfigurationsResponse>
   <ConfigurationArray xsi:type="SOAP-ENC:arrayType"
    SOAP-ENC:arrayType="xsd:string[2]">
    <configuration xsi:type="xsd:string">
      <![CDATA[Configuration 1]]>
    </configuration>
    <configuration xsi:type="xsd:string">
      <![CDATA[Configuration 2]]>
    </configuration>
   </ConfigurationArray>
  </AllConfigurationsResponse>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Axis cannot interpret the response if the soap body contains type info (xsi:type
= ???). A "Bad Types" SAXException is throwed.
But if the type info is removed, Axis can interpret the response.
The following WSDL is used to generate the Axis code (note use="literal"):

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/";
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/";
             xmlns:s="http://www.w3.org/2001/XMLSchema";
             xmlns:s0="my.namespace.se"
             xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";
             targetNamespace="my.namespace.se"
             xmlns="http://schemas.xmlsoap.org/wsdl/";>
  <types>
    <s:schema elementFormDefault="qualified" targetNamespace="factum.se/dab">
      <s:element name="RequestAllConfigurations">
        <s:complexType />
      </s:element>
      <s:element name="AllConfigurationsResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="ConfigurationArray"
type="s0:ArrayOfConfigurations" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="ArrayOfConfigurations">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="configuration"
nillable="true" type="s:string" />
        </s:sequence>
      </s:complexType>
      <s:element name="ArrayOfConfigurations" nillable="true"
type="s0:ArrayOfConfigurations" />
    </s:schema>
  </types>

  <message name="InAllConfigurations">
    <part name="parameters" element="s0:RequestAllConfigurations" />
  </message>
  <message name="OutAllConfigurations">
    <part name="parameters" element="s0:AllConfigurationsResponse" />
  </message>

  <portType name="ApiPort">
    <operation name="RequestAllConfigurations">
      <input name="InAllConfigurations" message="s0:InAllConfigurations" />
      <output name="OutAllConfigurations" message="s0:OutAllConfigurations" />
    </operation>
  </portType>

  <binding name="ApiBinding" type="s0:ApiPort">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http";
style="document" />
    <operation name="RequestAllConfigurations">
      <soap:operation soapAction="/DabCtrlApi" style="document" />
      <input name="InAllConfigurations">
        <soap:body use="literal" />
      </input>
      <output name="OutAllConfigurations">
        <soap:body use="literal" />
      </output>
    </operation>
  </binding>

  <service name="DabCtrlApi">
    <port name="ApiPort" binding="s0:ApiBinding">
      <soap:address location="http://localhost/"; />
    </port>
  </service>
</definitions>

Reply via email to