Hi all,

I have a big problem with Axis: I need to make an Axis client communicate
with a gSOAP C server hosting my web service. Both of them are generated
from the same WSDL document, and they are both rpc/litteral (I didn't choose
it, the gSOAP server is already implemented and I can't modify it).

My problem is the following: my axis client launches the request, my gSOAP
server processes it without difficulty, but when it receives the response my
client raises the following exception:

AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode:
 faultString: org.xml.sax.SAXException: Invalid element in
com.project.ListOfAURO - AffiliateUserRequestOutput
 faultActor:
 faultNode:
 faultDetail:
        {http://xml.apache.org/axis/}stackTrace:org.xml.sax.SAXException:
Invalid element in com.project.ListOfAURO - AffiliateUserRequestOutput
        at
org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.
java:223)
        at
org.apache.axis.encoding.DeserializationContext.startElement(Deserialization
Context.java:1025)
        at
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:159)
        at
org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:
845)
        at
org.apache.axis.message.RPCElement.deserialize(RPCElement.java:198)
        at org.apache.axis.message.RPCElement.getParams(RPCElement.java:323)
        at org.apache.axis.client.Call.invoke(Call.java:2418)
        at org.apache.axis.client.Call.invoke(Call.java:2317)
        at org.apache.axis.client.Call.invoke(Call.java:1774)
        at
com.project.ProjectInterfaceBindingStub.affiliateUser(ProjectInterfaceBindin
gStub.java:499)
        at userCheckServlet.doGet(userCheckServlet.java:168)


Here come the interesting parts of the WSDL I use:

These are the 2 OUT parameters of my method AffiliateUser:

<xsd:simpleType name="GECReport">
 <xsd:restriction base="xsd:string">
        <xsd:enumeration value="GEC_OK"/>
        <xsd:enumeration value="GEC_GenericErrorCode"/>
        <xsd:enumeration value="GEC_DataBaseError"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="ListOfAURO">
  <xsd:sequence>
        <xsd:element name="AffiliateUserRequestOutput"
type="lns:AffiliateUserRequestOutput"
          maxOccurs ="unbounded"
          minOccurs="0"/>
  </xsd:sequence>
</xsd:complexType>


<xsd:simpleType name="AUReport">
 <xsd:restriction base="xsd:string">
        <xsd:enumeration value="AU_OK"/>
        <xsd:enumeration value="AU_AffiliationFailed"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="AffiliateUserRequestOutput">
  <xsd:sequence>
        <xsd:element name="UserSymbolicAddress" type="xsd:string"/>
        <xsd:element name="AffiliationReport" type="lns:AUReport"/>
  </xsd:sequence>
</xsd:complexType>


The Request and Response messages:

<wsdl:message name="AffiliateUser">
  <wsdl:part 
        name="ServiceType"
        type="rns:Service"/>
  <wsdl:part 
        name="ListOfInputParameters"
        type="lns:ListOfAUIP"/>
</wsdl:message>
<wsdl:message name="AffiliateUserResponse">
  <wsdl:part 
        name="ListOfOutputParameters"
        type="lns:ListOfAURO"/>
  <wsdl:part 
        name="return"
        type="lns:GECReport"/>
</wsdl:message>

<wsdl:portType name="Project-Interface">
<wsdl:operation name="AffiliateUser">
        <wsdl:input message="lns:AffiliateUser"/>
        <wsdl:output message="lns:AffiliateUserResponse"/>
</wsdl:operation>
</wsdl:portType>


The messages (both request and response) seem to be well-formed.

After some researches in the mailing-list archives I tried to change the
WSDL and use low case strings like this: 

<xsd:complexType name="AffiliateUserRequestOutput">
  <xsd:sequence>
        <xsd:element name="userSymbolicAddress" type="xsd:string"/>
        <xsd:element name="affiliationReport" type="lns:AUReport"/>
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="ListOfAURO">
  <xsd:sequence>
        <xsd:element name="affiliateUserRequestOutput"
type="lns:AffiliateUserRequestOutput"
          maxOccurs ="unbounded"
          minOccurs="0"/>
  </xsd:sequence>
</xsd:complexType>

<wsdl:message name="AffiliateUser">
  <wsdl:part 
        name="ServiceType"
        type="ips:Service"/>
  <wsdl:part 
        name="ListOfInputParameters"
        type="lns:ListOfAUIP"/>
</wsdl:message>
<wsdl:message name="AffiliateUserResponse">
  <wsdl:part 
        name="listOfOutputParameters"
        type="lns:ListOfAURO"/>
  <wsdl:part 
        name="return"
        type="lns:GECReport"/>
</wsdl:message>


With this configuration on both sides, I don't have the exception but when I
try to access the holders' attributes, it raises a
java.lang.NullPointerException...

Here is a part of my client code with the way I deal with the holders:

// ListOfAUROHolder
// just one user
AffiliateUserRequestOutput affiliateUserRequestOutput = new
AffiliateUserRequestOutput();
AffiliateUserRequestOutput[] affiliateUserRequestOutputArray = new
AffiliateUserRequestOutput[1];
affiliateUserRequestOutputArray[0] = affiliateUserRequestOutput;

ListOfAUROHolder listOfOutputParameters = new ListOfAUROHolder(new
ListOfAURO(affiliateUserRequestOutputArray));
                                
// GECReportHolder
GECReportHolder _return = new GECReportHolder();

// Make the actual call
locPort.affiliateUser(Service.fromValue(serviceType), listOfInputParameters,
listOfOutputParameters, _return);

ListOfAURO listOfAURO = listOfOutputParameters.value;
AffiliateUserRequestOutput[] auro =
listOfAURO.getAffiliateUserRequestOutput();

This line raises the exception.

Here is the signature of ListOfAURO class:

public class ListOfAURO  implements java.io.Serializable {
private com.thalesgroup.IPS.LOC_xSV.AffiliateUserRequestOutput[]
affiliateUserRequestOutput;


Can anyone help me ? Do I have missed something with holders ? When I use my
client with a fake Axis server, there is no problem...


Thanks.
Laurent


Reply via email to