Hi guys,

its the first time that i am using the axis framework with c++ (usually i do not develop with c/c++). I wrote a simple calculation web service with java and deployed it to the app-server.
The following wsdl has been generated:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"; xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"; xmlns:ns0="http://test.cadenas.de"; xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"; xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"; xmlns:ns1="http://org.apache.axis2/xsd"; xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"; targetNamespace="http://test.cadenas.de";>
  <wsdl:documentation>TestService</wsdl:documentation>
  <wsdl:types>
<xs:schema xmlns:ns="http://test.cadenas.de"; attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://test.cadenas.de";>
          <xs:element name="add">
              <xs:complexType>
                  <xs:sequence>
<xs:element minOccurs="0" name="num1" type="xs:int"/> <xs:element minOccurs="0" name="num2" type="xs:int"/>
                  </xs:sequence>
              </xs:complexType>
          </xs:element>
          <xs:element name="addResponse">
              <xs:complexType>
                  <xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:int"/>
                  </xs:sequence>
              </xs:complexType>
          </xs:element>
      </xs:schema>
  </wsdl:types>
  <wsdl:message name="addRequest">
      <wsdl:part name="parameters" element="ns0:add"/>
  </wsdl:message>
  <wsdl:message name="addResponse">
      <wsdl:part name="parameters" element="ns0:addResponse"/>
  </wsdl:message>
  <wsdl:portType name="TestServicePortType">
      <wsdl:operation name="add">
          <wsdl:input message="ns0:addRequest" wsaw:Action="urn:add"/>
<wsdl:output message="ns0:addResponse" wsaw:Action="urn:addResponse"/>
      </wsdl:operation>
  </wsdl:portType>
<wsdl:binding name="TestServiceSOAP11Binding" type="ns0:TestServicePortType"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http"; style="document"/>
      <wsdl:operation name="add">
          <soap:operation soapAction="urn:add" style="document"/>
          <wsdl:input>
              <soap:body use="literal"/>
          </wsdl:input>
          <wsdl:output>
              <soap:body use="literal"/>
          </wsdl:output>
      </wsdl:operation>
  </wsdl:binding>
<wsdl:binding name="TestServiceSOAP12Binding" type="ns0:TestServicePortType"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"; style="document"/>
      <wsdl:operation name="add">
          <soap12:operation soapAction="urn:add" style="document"/>
          <wsdl:input>
              <soap12:body use="literal"/>
          </wsdl:input>
          <wsdl:output>
              <soap12:body use="literal"/>
          </wsdl:output>
      </wsdl:operation>
  </wsdl:binding>
<wsdl:binding name="TestServiceHttpBinding" type="ns0:TestServicePortType">
      <http:binding verb="POST"/>
      <wsdl:operation name="add">
          <http:operation location="TestService/add"/>
          <wsdl:input>
              <mime:content type="text/xml" part="add"/>
          </wsdl:input>
          <wsdl:output>
              <mime:content type="text/xml" part="add"/>
          </wsdl:output>
      </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="TestService">
<wsdl:port name="TestServiceSOAP11port_http" binding="ns0:TestServiceSOAP11Binding"> <soap:address location="http://localhost:8080/cadenas/services/TestService"/>
      </wsdl:port>
<wsdl:port name="TestServiceSOAP12port_http" binding="ns0:TestServiceSOAP12Binding"> <soap12:address location="http://localhost:8080/cadenas/services/TestService"/>
      </wsdl:port>
<wsdl:port name="TestServiceHttpport" binding="ns0:TestServiceHttpBinding"> <http:address location="http://localhost:8080/cadenas/services/TestService"/>
      </wsdl:port>
  </wsdl:service>
</wsdl:definitions>


You can see that it is a very simple service, which provides a "int add(int,int)" method.
I used the wsdl2ws tool to get this declaration for the "add" method:

STORAGE_CLASS_INFO xsd__int * add(xsd__int * Value0, xsd__int * Value1);

Generally i do not have a problem with pointers (tho i don't like primitive type pointers), but when i get an xsd__int* back from method which is always empty (NULL) im worried :P

I found the reason in the generated class "TestServicePortType" in method "add":
(read comments please)

...
          xsd__int * pReturn = m_pCall->getElementAsInt("return", 0);
          if(pReturn)
          {
              Ret = *pReturn; // byVal (copy) would be better.
Axis::AxisDelete( (void *) pReturn, XSD_INT); // Deletes the memory to which "Ret" points.
          }
...

I changed the datatype of variable "Ret" and the return type of the method from "xsd__int*" to "xsd__int" and now everything works fine.

Is this a generally known bug or is there a way to tell the wsdl2ws tool, that i dont like primitive datatype
pointers as return value?

It's also possible that i am completely wrong... so please help me :-)

Regards,
Manuel

Sorry for my bad english.


Reply via email to