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 Timothy Thorpe <ti...@criticalpath.net> on 2005/04/15 15:35:41 UTC

Converting RPC/Enc web service to RPC/Lit - SimpleDeserializer exception

Hello all

 

My web service is running AXIS 1.1.

 

To improve performance of my AXIS web service I have converted it, and its
client, from RPC/Encoded to RPC/Literal, in an effort to reduce message size
by dropping the 'over-the-top' multiRefs & types.

 

Now my client (which was working with the web service fine when using
RPC/Encoded) gets the following exception back from the web service:

----------------------------------------------------------------------------
-------------------------------------------

Axis Fault code:
{http://schemas.xmlsoap.org/soap/envelope/}Server.userException 

Axis Fault string: org.xml.sax.SAXException: SimpleDeserializer encountered
a child element, which is NOT expected, in something it was trying to
deserialize. 

----------------------------------------------------------------------------
-------------------------------------------

 

I will summarise below what I have done to convert service & client from
RPC/Encoded to RPC/Literal - perhaps someone can tell me the glaringly
obvious step I have failed to do ?

 

Many Thanks,

Tim 

 

Step 1: I re-deployed the web service to use 'RPC/Lit' by specifying the
'user' attribute to the <service> node in my WSDD file, thus:

----------------------------------------------------------------------------
-------------------------------------------

<deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/" 

    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 

  <service name="TSMAdapter_RPC_Lit" style="RPC" use="literal">

    <parameter name="className" value="net.cp.adapter.TSMAdapter"/>

    <parameter name="allowedMethods" value="addUser, modifyUser, deleteUser,
renameUser"/>

    <parameter name="allowedRoles" value="memum"/>

    <parameter name="wsdlServicePort" value="TSMAdapter_RPC_Lit"/>

 

    <operation name="addUser">

       <parameter name="hUserDtls"/>

    </operation>

 

    <operation name="modifyUser">

       <parameter name="hUserDtls"/>

    </operation>

 

    <operation name="deleteUser">

       <parameter name="hUserDtls"/>

    </operation>

 

    <operation name="renameUser">

       <parameter name="hUserToRenameDtls"/>

       <parameter name="hUserNewDtls"/>

    </operation>

 

    <beanMapping qname="responseNS:TSMAdapterFault"
xmlns:responseNS="urn:TSMAdapter"

               languageSpecificType="java:net.cp.adapter.TSMAdapterFault"/>

    <beanMapping qname="responseNS:TSMAdapterResponse"
xmlns:responseNS="urn:TSMAdapter"

 
languageSpecificType="java:net.cp.adapter.TSMAdapterResponse"/>

 

      <typeMapping

        xmlns:ns="http://content.services.hrs.harris.com/"

        qname="ns:ProgramContent"

        type="java:com.harris.hrs.services.content.ProgramContent"

        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

        encodingStyle=""

      />

 

    <requestFlow name="checks">

      <handler
type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

      <handler
type="java:org.apache.axis.handlers.SimpleAuthorizationHandler"/>

    </requestFlow>

  </service>

 

</deployment> 

----------------------------------------------------------------------------
-------------------------------------------

 

Step 2: I used JavaToWSDL with the "-y RPC -u LITERAL" parameters to create
a new 'RPC/Lit' WSDL for the service.

Step 3: I used WSDLToJava to build client stubs from this 'RPC/Lit' WSDL
file.

 

I can now see the following reassuring settings in my new client
'SoapBindStub':

----------------------------------------------------------------------------
-------------------------------------------

        org.apache.axis.client.Call _call = createCall();

        _call.setOperation(_operations[0]);

        _call.setUseSOAPAction(true);

        _call.setSOAPActionURI("");

        _call.setEncodingStyle(null);

        _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR,
Boolean.FALSE);

        _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS,
Boolean.FALSE);

 
_call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);

        _call.setOperationName(new
javax.xml.namespace.QName("urn:TSMAdapter_RPC_Lit", "addUser")); 

----------------------------------------------------------------------------
-------------------------------------------

 

I have used the AXIS TCP monitor to check on the client's SOAP Request and
see the following, which matches the old RPC/Enc version BUT WITHOUT the
multiRefs & types:

----------------------------------------------------------------------------
-------------------------------------------

POST /TSMAdapter_RPC_Lit/services/TSMAdapter HTTP/1.0

Content-Type: text/xml; charset=utf-8

Accept: application/soap+xml, application/dime, multipart/related, text/*

User-Agent: Axis/1.1

Host: 127.0.0.1

Cache-Control: no-cache

Pragma: no-cache

SOAPAction: ""

Content-Length: 1826

Authorization: Basic bWVtdW06U2NvdHQxc2g=

 

<?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>

  <addUser xmlns="urn:TSMAdapter_RPC_Lit">

   <hUserDtls xmlns="">

    <item xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://xml.apache.org/xml-soap">

     <key>password</key>

     <value>p</value>

    </item>

    <item>

     <key>diskquota</key>

     <value>2048</value>

    </item>

    <item>

     <key>contextID</key>

     <value>qwerty1234_1113550647291</value>

    </item>

    <item>

     <key>userID</key>

     <value>qwerty1234</value>

    </item>

    <item>

     <key>notifyrecipients</key>

     <value>

      <item>0702630331@sms.dof.se</item>

     </value>

    </item>

    <item>

     <key>masteralias</key>

     <value>timothy.thorpe@dof.se</value>

    </item>

    <item>

     <key>givenname</key>

     <value>Timothy</value>

    </item>

    <item>

     <key>status</key>

     <value>ENABLED</value>

    </item>

    <item>

     <key>clientMSISDN</key>

     <value>46702630331</value>

    </item>

    <item>

     <key>alias</key>

     <value>

      <item>tim.thorpe@dof.se</item>

      <item>t.thorpe@dof.se</item>

     </value>

    </item>

    <item>

     <key>sn</key>

     <value>Thorpe</value>

    </item>

    <item>

     <key>cos</key>

     <value>2903</value>

    </item>

    <item>

     <key>migrate</key>

     <value>false</value>

    </item>

    <item>

     <key>aliasdomain</key>

     <value>dof.se</value>

    </item>

    <item>

     <key>domain</key>

     <value>pne.dof.mobile.se</value>

    </item>

    <item>

     <key>sievestatus</key>

     <value>ENABLED</value>

    </item>

   </hUserDtls>

  </addUser>

 </soapenv:Body>

</soapenv:Envelope>

----------------------------------------------------------------------------
-------------------------------------------

 

The TCP Monitor shows the following Fault being returned:

----------------------------------------------------------------------------
-------------------------------------------

HTTP/1.1 500 Internal Server Error

Content-Type: text/xml;charset=utf-8

Date: Fri, 15 Apr 2005 07:37:29 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/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 <soapenv:Body>

  <soapenv:Fault>

   <faultcode>soapenv:Server.userException</faultcode>

   <faultstring>org.xml.sax.SAXException: SimpleDeserializer encountered a
child element, which is NOT expected, in something it was trying to
deserialize.</faultstring>

   <detail/>

  </soapenv:Fault>

 </soapenv:Body>

</soapenv:Envelope>

----------------------------------------------------------------------------
-------------------------------------------

 

 

Timothy Thorpe

Consultant Software Engineer

 

 


RE: Converting RPC/Enc web service to RPC/Lit - SimpleDeserializer exception

Posted by Timothy Thorpe <ti...@criticalpath.net>.
Anne

Thank you for your response.

I will try my RPC/Lit with Axis 1.2 - with a view to persuading my customer
to upgrade in the near future.

In the meantime, as 1.1 is the version in use on our 'live' system, I have
tried wrapped/literal with Axis 1.1 (JavaToWSDL to generate the WSDL,
WSDLToJava to generate the client stub) - & see the exact same failure at
the web service.

I would be most grateful if you could look at the attached evidence (WSDL
included this time, as well as WSDDs + 2x tcpmon traces; showing a
successful RPC/Enc exchange & the unsuccessful Wrapped/Lit exchange) &
hopefully tell me what I am doing wrong ? 

Rgds,
Tim

-----Original Message-----
From: Anne Thomas Manes [mailto:atmanes@gmail.com] 
Sent: 15 April 2005 19:41
To: axis-user@ws.apache.org
Subject: Re: Converting RPC/Enc web service to RPC/Lit - SimpleDeserializer
exception

Try switching to wrapped document/literal style or upgrading to Axis
1.2. Axis 1.1 doesn't really support RPC/Literal.

(Also, in the future, please include the WSDL file when requesting
assistance.)

Anne

On 4/15/05, Timothy Thorpe <ti...@criticalpath.net> wrote:
>  
>  
> 
> Could the problem here be that the parameter to the client method invoked
is
> of type 'java.util.HashMap' & so I have to inform the web service to use
an
> appropriate deserializer for the resultant '<hUserDtls>' node in the SOAP
> Body (otherwise it will just use a default, & inappropriate in this case,
> SimpleDeserializer) ? 
> 
>   
> 
> If so, I how do I inform the web service which deserializer to use for a
> given method parameter ? 
> 
>   
> 
> Fuller extract of client 'SoapBindingStub' generated by WSDLToJava: 
> 
>   
> 
>     public TSMAdapter_RPC_Lit.TSMAdapterResponse
> addUser(java.util.HashMap hUserDtls) throws java.rmi.RemoteException,
> TSMAdapter_RPC_Lit.TSMAdapterFault { 
> 
>         if (super.cachedEndpoint == null) { 
> 
>             throw new
> org.apache.axis.NoEndPointException(); 
> 
>         } 
> 
>         org.apache.axis.client.Call _call = createCall(); 
> 
>         _call.setOperation(_operations[0]); 
> 
>         _call.setUseSOAPAction(true); 
> 
>         _call.setSOAPActionURI(""); 
> 
>         _call.setEncodingStyle(null); 
> 
>        
> _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR,
> Boolean.FALSE); 
> 
>        
> _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS,
> Boolean.FALSE); 
> 
>        
> _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
> 
>         _call.setOperationName(new
> javax.xml.namespace.QName("urn:TSMAdapter_RPC_Lit", "addUser")); 
> 
>   
> 
>         setRequestHeaders(_call); 
> 
>         setAttachments(_call); 
> 
>         java.lang.Object _resp = _call.invoke(new java.lang.Object[]
> {hUserDtls}); 
> 
>   
> 
>         if (_resp instanceof java.rmi.RemoteException) { 
> 
>             throw (java.rmi.RemoteException)_resp; 
> 
>         } 
> 
>         else { 
> 
>             extractAttachments(_call); 
> 
>             try { 
> 
>                 return
> (TSMAdapter_RPC_Lit.TSMAdapterResponse) _resp; 
> 
>             } catch (java.lang.Exception _exception) { 
> 
>                 return
> (TSMAdapter_RPC_Lit.TSMAdapterResponse)
> org.apache.axis.utils.JavaUtils.convert(_resp,
> TSMAdapter_RPC_Lit.TSMAdapterResponse.class); 
> 
>             } 
> 
>         } 
> 
>     } 
> 
>   
> 
> Tim   
> 
>   
> 
> -----Original Message-----
>  From: Timothy Thorpe [mailto:timothy.thorpe@criticalpath.net] 
>  Sent: 15 April 2005 14:36
>  To: axis-user@ws.apache.org
>  Subject: Converting RPC/Enc web service to RPC/Lit - SimpleDeserializer
> exception 
> 
>  
>  
> 
> Hello all 
> 
>   
> 
> My web service is running AXIS 1.1. 
> 
>   
> 
> To improve performance of my AXIS web service I have converted it, and its
> client, from RPC/Encoded to RPC/Literal, in an effort to reduce message
size
> by dropping the 'over-the-top' multiRefs & types. 
> 
>   
> 
> Now my client (which was working with the web service fine when using
> RPC/Encoded) gets the following exception back from the web service: 
> 
>
----------------------------------------------------------------------------
-------------------------------------------
> 
> Axis Fault code:
> {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
> 
> Axis Fault string: org.xml.sax.SAXException: SimpleDeserializer
encountered
> a child element, which is NOT expected, in something it was trying to
> deserialize. 
> 
>
----------------------------------------------------------------------------
-------------------------------------------
> 
>   
> 
> I will summarise below what I have done to convert service & client from
> RPC/Encoded to RPC/Literal - perhaps someone can tell me the glaringly
> obvious step I have failed to do ? 
> 
>   
> 
> Many Thanks, 
> 
> Tim 
> 
>   
> 
> Step 1: I re-deployed the web service to use 'RPC/Lit' by specifying the
> 'user' attribute to the <service> node in my WSDD file, thus: 
> 
>
----------------------------------------------------------------------------
-------------------------------------------
> 
> <deployment name="test"
> xmlns="http://xml.apache.org/axis/wsdd/" 
> 
>    
> xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
> 
>   
> 
>   <service name="TSMAdapter_RPC_Lit" style="RPC" use="literal"> 
> 
>     <parameter name="className" value="net.cp.adapter.TSMAdapter"/> 
> 
>     <parameter name="allowedMethods" value="addUser, modifyUser,
deleteUser,
> renameUser"/> 
> 
>     <parameter name="allowedRoles" value="memum"/> 
> 
>     <parameter name="wsdlServicePort" value="TSMAdapter_RPC_Lit"/> 
> 
>   
> 
>     <operation name="addUser"> 
> 
>        <parameter name="hUserDtls"/> 
> 
>     </operation> 
> 
>   
> 
>     <operation name="modifyUser"> 
> 
>        <parameter name="hUserDtls"/> 
> 
>     </operation> 
> 
>   
> 
>     <operation name="deleteUser"> 
> 
>        <parameter name="hUserDtls"/> 
> 
>     </operation> 
> 
>   
> 
>     <operation name="renameUser"> 
> 
>        <parameter name="hUserToRenameDtls"/> 
> 
>        <parameter name="hUserNewDtls"/> 
> 
>     </operation> 
> 
>   
> 
>     <beanMapping qname="responseNS:TSMAdapterFault"
> xmlns:responseNS="urn:TSMAdapter" 
> 
>
languageSpecificType="java:net.cp.adapter.TSMAdapterFault"/> 
> 
>     <beanMapping qname="responseNS:TSMAdapterResponse"
> xmlns:responseNS="urn:TSMAdapter" 
> 
>               
> languageSpecificType="java:net.cp.adapter.TSMAdapterResponse"/>
> 
>   
> 
>       <typeMapping 
> 
>         xmlns:ns="http://content.services.hrs.harris.com/" 
> 
>         qname="ns:ProgramContent" 
> 
>        
> type="java:com.harris.hrs.services.content.ProgramContent" 
> 
>        
> serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
> 
>        
> deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
> 
>         encodingStyle="" 
> 
>       /> 
> 
>   
> 
>     <requestFlow name="checks"> 
> 
>       <handler
> type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
> 
>       <handler
> type="java:org.apache.axis.handlers.SimpleAuthorizationHandler"/>
> 
>     </requestFlow> 
> 
>   </service> 
> 
>   
> 
> </deployment> 
> 
>
----------------------------------------------------------------------------
-------------------------------------------
> 
>   
> 
> Step 2: I used JavaToWSDL with the "-y RPC -u LITERAL" parameters to
create
> a new 'RPC/Lit' WSDL for the service. 
> 
> Step 3: I used WSDLToJava to build client stubs from this 'RPC/Lit' WSDL
> file. 
> 
>   
> 
> I can now see the following reassuring settings in my new client
> 'SoapBindStub': 
> 
>
----------------------------------------------------------------------------
-------------------------------------------
> 
>         org.apache.axis.client.Call _call = createCall(); 
> 
>         _call.setOperation(_operations[0]); 
> 
>         _call.setUseSOAPAction(true); 
> 
>         _call.setSOAPActionURI(""); 
> 
>         _call.setEncodingStyle(null); 
> 
>        
> _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR,
> Boolean.FALSE); 
> 
>        
> _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS,
> Boolean.FALSE); 
> 
>        
> _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
> 
>         _call.setOperationName(new
> javax.xml.namespace.QName("urn:TSMAdapter_RPC_Lit", "addUser")); 
> 
>
----------------------------------------------------------------------------
-------------------------------------------
> 
>   
> 
> I have used the AXIS TCP monitor to check on the client's SOAP Request and
> see the following, which matches the old RPC/Enc version BUT WITHOUT the
> multiRefs & types: 
> 
>
----------------------------------------------------------------------------
-------------------------------------------
> 
> POST /TSMAdapter_RPC_Lit/services/TSMAdapter HTTP/1.0 
> 
> Content-Type: text/xml; charset=utf-8 
> 
> Accept: application/soap+xml, application/dime, multipart/related, text/* 
> 
> User-Agent: Axis/1.1 
> 
> Host: 127.0.0.1 
> 
> Cache-Control: no-cache 
> 
> Pragma: no-cache 
> 
> SOAPAction: "" 
> 
> Content-Length: 1826 
> 
> Authorization: Basic bWVtdW06U2NvdHQxc2g= 
> 
>   
> 
> <?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> 
> 
>   <addUser xmlns="urn:TSMAdapter_RPC_Lit"> 
> 
>    <hUserDtls xmlns=""> 
> 
>     <item
> xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
> xmlns:ns1="http://xml.apache.org/xml-soap"> 
> 
>      <key>password</key> 
> 
>      <value>p</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>diskquota</key> 
> 
>      <value>2048</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>contextID</key> 
> 
>      <value>qwerty1234_1113550647291</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>userID</key> 
> 
>      <value>qwerty1234</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>notifyrecipients</key> 
> 
>      <value> 
> 
>       <item>0702630331@sms.dof.se</item> 
> 
>      </value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>masteralias</key> 
> 
>      <value>timothy.thorpe@dof.se</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>givenname</key> 
> 
>      <value>Timothy</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>status</key> 
> 
>      <value>ENABLED</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>clientMSISDN</key> 
> 
>      <value>46702630331</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>alias</key> 
> 
>      <value> 
> 
>       <item>tim.thorpe@dof.se</item> 
> 
>       <item>t.thorpe@dof.se</item> 
> 
>      </value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>sn</key> 
> 
>      <value>Thorpe</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>cos</key> 
> 
>      <value>2903</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>migrate</key> 
> 
>      <value>false</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>aliasdomain</key> 
> 
>      <value>dof.se</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>domain</key> 
> 
>      <value>pne.dof.mobile.se</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>sievestatus</key> 
> 
>      <value>ENABLED</value> 
> 
>     </item> 
> 
>    </hUserDtls> 
> 
>   </addUser> 
> 
>  </soapenv:Body> 
> 
> </soapenv:Envelope> 
> 
>
----------------------------------------------------------------------------
-------------------------------------------
> 
>   
> 
> The TCP Monitor shows the following Fault being returned: 
> 
>
----------------------------------------------------------------------------
-------------------------------------------
> 
> HTTP/1.1 500 Internal Server Error 
> 
> Content-Type: text/xml;charset=utf-8 
> 
> Date: Fri, 15 Apr 2005 07:37:29 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/"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
> 
>  <soapenv:Body> 
> 
>   <soapenv:Fault> 
> 
>    <faultcode>soapenv:Server.userException</faultcode> 
> 
>    <faultstring>org.xml.sax.SAXException: SimpleDeserializer encountered a
> child element, which is NOT expected, in something it was trying to
> deserialize.</faultstring> 
> 
>    <detail/> 
> 
>   </soapenv:Fault> 
> 
>  </soapenv:Body> 
> 
> </soapenv:Envelope> 
> 
>
----------------------------------------------------------------------------
-------------------------------------------
> 
>   
> 
>   
> 
> Timothy Thorpe 
> 
> Consultant Software Engineer 
> 
>   
> 
>

Re: Converting RPC/Enc web service to RPC/Lit - SimpleDeserializer exception

Posted by Anne Thomas Manes <at...@gmail.com>.
Try switching to wrapped document/literal style or upgrading to Axis
1.2. Axis 1.1 doesn't really support RPC/Literal.

(Also, in the future, please include the WSDL file when requesting assistance.)

Anne

On 4/15/05, Timothy Thorpe <ti...@criticalpath.net> wrote:
>  
>  
> 
> Could the problem here be that the parameter to the client method invoked is
> of type 'java.util.HashMap' & so I have to inform the web service to use an
> appropriate deserializer for the resultant '<hUserDtls>' node in the SOAP
> Body (otherwise it will just use a default, & inappropriate in this case,
> SimpleDeserializer) ? 
> 
>   
> 
> If so, I how do I inform the web service which deserializer to use for a
> given method parameter ? 
> 
>   
> 
> Fuller extract of client 'SoapBindingStub' generated by WSDLToJava: 
> 
>   
> 
>     public TSMAdapter_RPC_Lit.TSMAdapterResponse
> addUser(java.util.HashMap hUserDtls) throws java.rmi.RemoteException,
> TSMAdapter_RPC_Lit.TSMAdapterFault { 
> 
>         if (super.cachedEndpoint == null) { 
> 
>             throw new
> org.apache.axis.NoEndPointException(); 
> 
>         } 
> 
>         org.apache.axis.client.Call _call = createCall(); 
> 
>         _call.setOperation(_operations[0]); 
> 
>         _call.setUseSOAPAction(true); 
> 
>         _call.setSOAPActionURI(""); 
> 
>         _call.setEncodingStyle(null); 
> 
>        
> _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR,
> Boolean.FALSE); 
> 
>        
> _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS,
> Boolean.FALSE); 
> 
>        
> _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
> 
>         _call.setOperationName(new
> javax.xml.namespace.QName("urn:TSMAdapter_RPC_Lit", "addUser")); 
> 
>   
> 
>         setRequestHeaders(_call); 
> 
>         setAttachments(_call); 
> 
>         java.lang.Object _resp = _call.invoke(new java.lang.Object[]
> {hUserDtls}); 
> 
>   
> 
>         if (_resp instanceof java.rmi.RemoteException) { 
> 
>             throw (java.rmi.RemoteException)_resp; 
> 
>         } 
> 
>         else { 
> 
>             extractAttachments(_call); 
> 
>             try { 
> 
>                 return
> (TSMAdapter_RPC_Lit.TSMAdapterResponse) _resp; 
> 
>             } catch (java.lang.Exception _exception) { 
> 
>                 return
> (TSMAdapter_RPC_Lit.TSMAdapterResponse)
> org.apache.axis.utils.JavaUtils.convert(_resp,
> TSMAdapter_RPC_Lit.TSMAdapterResponse.class); 
> 
>             } 
> 
>         } 
> 
>     } 
> 
>   
> 
> Tim   
> 
>   
> 
> -----Original Message-----
>  From: Timothy Thorpe [mailto:timothy.thorpe@criticalpath.net] 
>  Sent: 15 April 2005 14:36
>  To: axis-user@ws.apache.org
>  Subject: Converting RPC/Enc web service to RPC/Lit - SimpleDeserializer
> exception 
> 
>  
>  
> 
> Hello all 
> 
>   
> 
> My web service is running AXIS 1.1. 
> 
>   
> 
> To improve performance of my AXIS web service I have converted it, and its
> client, from RPC/Encoded to RPC/Literal, in an effort to reduce message size
> by dropping the 'over-the-top' multiRefs & types. 
> 
>   
> 
> Now my client (which was working with the web service fine when using
> RPC/Encoded) gets the following exception back from the web service: 
> 
> -----------------------------------------------------------------------------------------------------------------------
> 
> Axis Fault code:
> {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
> 
> Axis Fault string: org.xml.sax.SAXException: SimpleDeserializer encountered
> a child element, which is NOT expected, in something it was trying to
> deserialize. 
> 
> -----------------------------------------------------------------------------------------------------------------------
> 
>   
> 
> I will summarise below what I have done to convert service & client from
> RPC/Encoded to RPC/Literal – perhaps someone can tell me the glaringly
> obvious step I have failed to do ? 
> 
>   
> 
> Many Thanks, 
> 
> Tim 
> 
>   
> 
> Step 1: I re-deployed the web service to use 'RPC/Lit' by specifying the
> 'user' attribute to the <service> node in my WSDD file, thus: 
> 
> -----------------------------------------------------------------------------------------------------------------------
> 
> <deployment name="test"
> xmlns="http://xml.apache.org/axis/wsdd/" 
> 
>    
> xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
> 
>   
> 
>   <service name="TSMAdapter_RPC_Lit" style="RPC" use="literal"> 
> 
>     <parameter name="className" value="net.cp.adapter.TSMAdapter"/> 
> 
>     <parameter name="allowedMethods" value="addUser, modifyUser, deleteUser,
> renameUser"/> 
> 
>     <parameter name="allowedRoles" value="memum"/> 
> 
>     <parameter name="wsdlServicePort" value="TSMAdapter_RPC_Lit"/> 
> 
>   
> 
>     <operation name="addUser"> 
> 
>        <parameter name="hUserDtls"/> 
> 
>     </operation> 
> 
>   
> 
>     <operation name="modifyUser"> 
> 
>        <parameter name="hUserDtls"/> 
> 
>     </operation> 
> 
>   
> 
>     <operation name="deleteUser"> 
> 
>        <parameter name="hUserDtls"/> 
> 
>     </operation> 
> 
>   
> 
>     <operation name="renameUser"> 
> 
>        <parameter name="hUserToRenameDtls"/> 
> 
>        <parameter name="hUserNewDtls"/> 
> 
>     </operation> 
> 
>   
> 
>     <beanMapping qname="responseNS:TSMAdapterFault"
> xmlns:responseNS="urn:TSMAdapter" 
> 
>                languageSpecificType="java:net.cp.adapter.TSMAdapterFault"/> 
> 
>     <beanMapping qname="responseNS:TSMAdapterResponse"
> xmlns:responseNS="urn:TSMAdapter" 
> 
>               
> languageSpecificType="java:net.cp.adapter.TSMAdapterResponse"/>
> 
>   
> 
>       <typeMapping 
> 
>         xmlns:ns="http://content.services.hrs.harris.com/" 
> 
>         qname="ns:ProgramContent" 
> 
>        
> type="java:com.harris.hrs.services.content.ProgramContent" 
> 
>        
> serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
> 
>        
> deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
> 
>         encodingStyle="" 
> 
>       /> 
> 
>   
> 
>     <requestFlow name="checks"> 
> 
>       <handler
> type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
> 
>       <handler
> type="java:org.apache.axis.handlers.SimpleAuthorizationHandler"/>
> 
>     </requestFlow> 
> 
>   </service> 
> 
>   
> 
> </deployment> 
> 
> -----------------------------------------------------------------------------------------------------------------------
> 
>   
> 
> Step 2: I used JavaToWSDL with the "-y RPC -u LITERAL" parameters to create
> a new 'RPC/Lit' WSDL for the service. 
> 
> Step 3: I used WSDLToJava to build client stubs from this 'RPC/Lit' WSDL
> file. 
> 
>   
> 
> I can now see the following reassuring settings in my new client
> 'SoapBindStub': 
> 
> -----------------------------------------------------------------------------------------------------------------------
> 
>         org.apache.axis.client.Call _call = createCall(); 
> 
>         _call.setOperation(_operations[0]); 
> 
>         _call.setUseSOAPAction(true); 
> 
>         _call.setSOAPActionURI(""); 
> 
>         _call.setEncodingStyle(null); 
> 
>        
> _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR,
> Boolean.FALSE); 
> 
>        
> _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS,
> Boolean.FALSE); 
> 
>        
> _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
> 
>         _call.setOperationName(new
> javax.xml.namespace.QName("urn:TSMAdapter_RPC_Lit", "addUser")); 
> 
> -----------------------------------------------------------------------------------------------------------------------
> 
>   
> 
> I have used the AXIS TCP monitor to check on the client's SOAP Request and
> see the following, which matches the old RPC/Enc version BUT WITHOUT the
> multiRefs & types: 
> 
> -----------------------------------------------------------------------------------------------------------------------
> 
> POST /TSMAdapter_RPC_Lit/services/TSMAdapter HTTP/1.0 
> 
> Content-Type: text/xml; charset=utf-8 
> 
> Accept: application/soap+xml, application/dime, multipart/related, text/* 
> 
> User-Agent: Axis/1.1 
> 
> Host: 127.0.0.1 
> 
> Cache-Control: no-cache 
> 
> Pragma: no-cache 
> 
> SOAPAction: "" 
> 
> Content-Length: 1826 
> 
> Authorization: Basic bWVtdW06U2NvdHQxc2g= 
> 
>   
> 
> <?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> 
> 
>   <addUser xmlns="urn:TSMAdapter_RPC_Lit"> 
> 
>    <hUserDtls xmlns=""> 
> 
>     <item
> xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
> xmlns:ns1="http://xml.apache.org/xml-soap"> 
> 
>      <key>password</key> 
> 
>      <value>p</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>diskquota</key> 
> 
>      <value>2048</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>contextID</key> 
> 
>      <value>qwerty1234_1113550647291</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>userID</key> 
> 
>      <value>qwerty1234</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>notifyrecipients</key> 
> 
>      <value> 
> 
>       <item>0702630331@sms.dof.se</item> 
> 
>      </value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>masteralias</key> 
> 
>      <value>timothy.thorpe@dof.se</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>givenname</key> 
> 
>      <value>Timothy</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>status</key> 
> 
>      <value>ENABLED</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>clientMSISDN</key> 
> 
>      <value>46702630331</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>alias</key> 
> 
>      <value> 
> 
>       <item>tim.thorpe@dof.se</item> 
> 
>       <item>t.thorpe@dof.se</item> 
> 
>      </value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>sn</key> 
> 
>      <value>Thorpe</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>cos</key> 
> 
>      <value>2903</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>migrate</key> 
> 
>      <value>false</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>aliasdomain</key> 
> 
>      <value>dof.se</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>domain</key> 
> 
>      <value>pne.dof.mobile.se</value> 
> 
>     </item> 
> 
>     <item> 
> 
>      <key>sievestatus</key> 
> 
>      <value>ENABLED</value> 
> 
>     </item> 
> 
>    </hUserDtls> 
> 
>   </addUser> 
> 
>  </soapenv:Body> 
> 
> </soapenv:Envelope> 
> 
> -----------------------------------------------------------------------------------------------------------------------
> 
>   
> 
> The TCP Monitor shows the following Fault being returned: 
> 
> -----------------------------------------------------------------------------------------------------------------------
> 
> HTTP/1.1 500 Internal Server Error 
> 
> Content-Type: text/xml;charset=utf-8 
> 
> Date: Fri, 15 Apr 2005 07:37:29 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/"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
> 
>  <soapenv:Body> 
> 
>   <soapenv:Fault> 
> 
>    <faultcode>soapenv:Server.userException</faultcode> 
> 
>    <faultstring>org.xml.sax.SAXException: SimpleDeserializer encountered a
> child element, which is NOT expected, in something it was trying to
> deserialize.</faultstring> 
> 
>    <detail/> 
> 
>   </soapenv:Fault> 
> 
>  </soapenv:Body> 
> 
> </soapenv:Envelope> 
> 
> -----------------------------------------------------------------------------------------------------------------------
> 
>   
> 
>   
> 
> Timothy Thorpe 
> 
> Consultant Software Engineer 
> 
>   
> 
>

RE: Converting RPC/Enc web service to RPC/Lit - SimpleDeserializer exception

Posted by Timothy Thorpe <ti...@criticalpath.net>.
Could the problem here be that the parameter to the client method invoked is
of type 'java.util.HashMap' & so I have to inform the web service to use an
appropriate deserializer for the resultant '<hUserDtls>' node in the SOAP
Body (otherwise it will just use a default, & inappropriate in this case,
SimpleDeserializer) ?

 

If so, I how do I inform the web service which deserializer to use for a
given method parameter ?

 

Tim  

 

-----Original Message-----
From: Timothy Thorpe [mailto:timothy.thorpe@criticalpath.net] 
Sent: 15 April 2005 14:36
To: axis-user@ws.apache.org
Subject: Converting RPC/Enc web service to RPC/Lit - SimpleDeserializer
exception

 

Hello all

 

My web service is running AXIS 1.1.

 

To improve performance of my AXIS web service I have converted it, and its
client, from RPC/Encoded to RPC/Literal, in an effort to reduce message size
by dropping the 'over-the-top' multiRefs & types.

 

Now my client (which was working with the web service fine when using
RPC/Encoded) gets the following exception back from the web service:

----------------------------------------------------------------------------
-------------------------------------------

Axis Fault code:
{http://schemas.xmlsoap.org/soap/envelope/}Server.userException 

Axis Fault string: org.xml.sax.SAXException: SimpleDeserializer encountered
a child element, which is NOT expected, in something it was trying to
deserialize. 

----------------------------------------------------------------------------
-------------------------------------------

 

I will summarise below what I have done to convert service & client from
RPC/Encoded to RPC/Literal - perhaps someone can tell me the glaringly
obvious step I have failed to do ?

 

Many Thanks,

Tim 

 

Step 1: I re-deployed the web service to use 'RPC/Lit' by specifying the
'user' attribute to the <service> node in my WSDD file, thus:

----------------------------------------------------------------------------
-------------------------------------------

<deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/" 

    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 

  <service name="TSMAdapter_RPC_Lit" style="RPC" use="literal">

    <parameter name="className" value="net.cp.adapter.TSMAdapter"/>

    <parameter name="allowedMethods" value="addUser, modifyUser, deleteUser,
renameUser"/>

    <parameter name="allowedRoles" value="memum"/>

    <parameter name="wsdlServicePort" value="TSMAdapter_RPC_Lit"/>

 

    <operation name="addUser">

       <parameter name="hUserDtls"/>

    </operation>

 

    <operation name="modifyUser">

       <parameter name="hUserDtls"/>

    </operation>

 

    <operation name="deleteUser">

       <parameter name="hUserDtls"/>

    </operation>

 

    <operation name="renameUser">

       <parameter name="hUserToRenameDtls"/>

       <parameter name="hUserNewDtls"/>

    </operation>

 

    <beanMapping qname="responseNS:TSMAdapterFault"
xmlns:responseNS="urn:TSMAdapter"

               languageSpecificType="java:net.cp.adapter.TSMAdapterFault"/>

    <beanMapping qname="responseNS:TSMAdapterResponse"
xmlns:responseNS="urn:TSMAdapter"

 
languageSpecificType="java:net.cp.adapter.TSMAdapterResponse"/>

 

      <typeMapping

        xmlns:ns="http://content.services.hrs.harris.com/"

        qname="ns:ProgramContent"

        type="java:com.harris.hrs.services.content.ProgramContent"

        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

        encodingStyle=""

      />

 

    <requestFlow name="checks">

      <handler
type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

      <handler
type="java:org.apache.axis.handlers.SimpleAuthorizationHandler"/>

    </requestFlow>

  </service>

 

</deployment> 

----------------------------------------------------------------------------
-------------------------------------------

 

Step 2: I used JavaToWSDL with the "-y RPC -u LITERAL" parameters to create
a new 'RPC/Lit' WSDL for the service.

Step 3: I used WSDLToJava to build client stubs from this 'RPC/Lit' WSDL
file.

 

I can now see the following reassuring settings in my new client
'SoapBindStub':

----------------------------------------------------------------------------
-------------------------------------------

        org.apache.axis.client.Call _call = createCall();

        _call.setOperation(_operations[0]);

        _call.setUseSOAPAction(true);

        _call.setSOAPActionURI("");

        _call.setEncodingStyle(null);

        _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR,
Boolean.FALSE);

        _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS,
Boolean.FALSE);

 
_call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);

        _call.setOperationName(new
javax.xml.namespace.QName("urn:TSMAdapter_RPC_Lit", "addUser")); 

----------------------------------------------------------------------------
-------------------------------------------

 

I have used the AXIS TCP monitor to check on the client's SOAP Request and
see the following, which matches the old RPC/Enc version BUT WITHOUT the
multiRefs & types:

----------------------------------------------------------------------------
-------------------------------------------

POST /TSMAdapter_RPC_Lit/services/TSMAdapter HTTP/1.0

Content-Type: text/xml; charset=utf-8

Accept: application/soap+xml, application/dime, multipart/related, text/*

User-Agent: Axis/1.1

Host: 127.0.0.1

Cache-Control: no-cache

Pragma: no-cache

SOAPAction: ""

Content-Length: 1826

Authorization: Basic bWVtdW06U2NvdHQxc2g=

 

<?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>

  <addUser xmlns="urn:TSMAdapter_RPC_Lit">

   <hUserDtls xmlns="">

    <item xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://xml.apache.org/xml-soap">

     <key>password</key>

     <value>p</value>

    </item>

    <item>

     <key>diskquota</key>

     <value>2048</value>

    </item>

    <item>

     <key>contextID</key>

     <value>qwerty1234_1113550647291</value>

    </item>

    <item>

     <key>userID</key>

     <value>qwerty1234</value>

    </item>

    <item>

     <key>notifyrecipients</key>

     <value>

      <item>0702630331@sms.dof.se</item>

     </value>

    </item>

    <item>

     <key>masteralias</key>

     <value>timothy.thorpe@dof.se</value>

    </item>

    <item>

     <key>givenname</key>

     <value>Timothy</value>

    </item>

    <item>

     <key>status</key>

     <value>ENABLED</value>

    </item>

    <item>

     <key>clientMSISDN</key>

     <value>46702630331</value>

    </item>

    <item>

     <key>alias</key>

     <value>

      <item>tim.thorpe@dof.se</item>

      <item>t.thorpe@dof.se</item>

     </value>

    </item>

    <item>

     <key>sn</key>

     <value>Thorpe</value>

    </item>

    <item>

     <key>cos</key>

     <value>2903</value>

    </item>

    <item>

     <key>migrate</key>

     <value>false</value>

    </item>

    <item>

     <key>aliasdomain</key>

     <value>dof.se</value>

    </item>

    <item>

     <key>domain</key>

     <value>pne.dof.mobile.se</value>

    </item>

    <item>

     <key>sievestatus</key>

     <value>ENABLED</value>

    </item>

   </hUserDtls>

  </addUser>

 </soapenv:Body>

</soapenv:Envelope>

----------------------------------------------------------------------------
-------------------------------------------

 

The TCP Monitor shows the following Fault being returned:

----------------------------------------------------------------------------
-------------------------------------------

HTTP/1.1 500 Internal Server Error

Content-Type: text/xml;charset=utf-8

Date: Fri, 15 Apr 2005 07:37:29 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/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 <soapenv:Body>

  <soapenv:Fault>

   <faultcode>soapenv:Server.userException</faultcode>

   <faultstring>org.xml.sax.SAXException: SimpleDeserializer encountered a
child element, which is NOT expected, in something it was trying to
deserialize.</faultstring>

   <detail/>

  </soapenv:Fault>

 </soapenv:Body>

</soapenv:Envelope>

----------------------------------------------------------------------------
-------------------------------------------

 

 

Timothy Thorpe

Consultant Software Engineer

 

 


RE: Converting RPC/Enc web service to RPC/Lit - SimpleDeserializer exception

Posted by Timothy Thorpe <ti...@criticalpath.net>.
Could the problem here be that the parameter to the client method invoked is
of type 'java.util.HashMap' & so I have to inform the web service to use an
appropriate deserializer for the resultant '<hUserDtls>' node in the SOAP
Body (otherwise it will just use a default, & inappropriate in this case,
SimpleDeserializer) ?

 

If so, I how do I inform the web service which deserializer to use for a
given method parameter ?

 

Fuller extract of client 'SoapBindingStub' generated by WSDLToJava:

 

    public TSMAdapter_RPC_Lit.TSMAdapterResponse addUser(java.util.HashMap
hUserDtls) throws java.rmi.RemoteException,
TSMAdapter_RPC_Lit.TSMAdapterFault {

        if (super.cachedEndpoint == null) {

            throw new org.apache.axis.NoEndPointException();

        }

        org.apache.axis.client.Call _call = createCall();

        _call.setOperation(_operations[0]);

        _call.setUseSOAPAction(true);

        _call.setSOAPActionURI("");

        _call.setEncodingStyle(null);

        _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR,
Boolean.FALSE);

        _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS,
Boolean.FALSE);

 
_call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);

        _call.setOperationName(new
javax.xml.namespace.QName("urn:TSMAdapter_RPC_Lit", "addUser"));

 

        setRequestHeaders(_call);

        setAttachments(_call);

        java.lang.Object _resp = _call.invoke(new java.lang.Object[]
{hUserDtls});

 

        if (_resp instanceof java.rmi.RemoteException) {

            throw (java.rmi.RemoteException)_resp;

        }

        else {

            extractAttachments(_call);

            try {

                return (TSMAdapter_RPC_Lit.TSMAdapterResponse) _resp;

            } catch (java.lang.Exception _exception) {

                return (TSMAdapter_RPC_Lit.TSMAdapterResponse)
org.apache.axis.utils.JavaUtils.convert(_resp,
TSMAdapter_RPC_Lit.TSMAdapterResponse.class);

            }

        }

    }

 

Tim  

 

-----Original Message-----
From: Timothy Thorpe [mailto:timothy.thorpe@criticalpath.net] 
Sent: 15 April 2005 14:36
To: axis-user@ws.apache.org
Subject: Converting RPC/Enc web service to RPC/Lit - SimpleDeserializer
exception

 

Hello all

 

My web service is running AXIS 1.1.

 

To improve performance of my AXIS web service I have converted it, and its
client, from RPC/Encoded to RPC/Literal, in an effort to reduce message size
by dropping the 'over-the-top' multiRefs & types.

 

Now my client (which was working with the web service fine when using
RPC/Encoded) gets the following exception back from the web service:

----------------------------------------------------------------------------
-------------------------------------------

Axis Fault code:
{http://schemas.xmlsoap.org/soap/envelope/}Server.userException 

Axis Fault string: org.xml.sax.SAXException: SimpleDeserializer encountered
a child element, which is NOT expected, in something it was trying to
deserialize. 

----------------------------------------------------------------------------
-------------------------------------------

 

I will summarise below what I have done to convert service & client from
RPC/Encoded to RPC/Literal - perhaps someone can tell me the glaringly
obvious step I have failed to do ?

 

Many Thanks,

Tim 

 

Step 1: I re-deployed the web service to use 'RPC/Lit' by specifying the
'user' attribute to the <service> node in my WSDD file, thus:

----------------------------------------------------------------------------
-------------------------------------------

<deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/" 

    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 

  <service name="TSMAdapter_RPC_Lit" style="RPC" use="literal">

    <parameter name="className" value="net.cp.adapter.TSMAdapter"/>

    <parameter name="allowedMethods" value="addUser, modifyUser, deleteUser,
renameUser"/>

    <parameter name="allowedRoles" value="memum"/>

    <parameter name="wsdlServicePort" value="TSMAdapter_RPC_Lit"/>

 

    <operation name="addUser">

       <parameter name="hUserDtls"/>

    </operation>

 

    <operation name="modifyUser">

       <parameter name="hUserDtls"/>

    </operation>

 

    <operation name="deleteUser">

       <parameter name="hUserDtls"/>

    </operation>

 

    <operation name="renameUser">

       <parameter name="hUserToRenameDtls"/>

       <parameter name="hUserNewDtls"/>

    </operation>

 

    <beanMapping qname="responseNS:TSMAdapterFault"
xmlns:responseNS="urn:TSMAdapter"

               languageSpecificType="java:net.cp.adapter.TSMAdapterFault"/>

    <beanMapping qname="responseNS:TSMAdapterResponse"
xmlns:responseNS="urn:TSMAdapter"

 
languageSpecificType="java:net.cp.adapter.TSMAdapterResponse"/>

 

      <typeMapping

        xmlns:ns="http://content.services.hrs.harris.com/"

        qname="ns:ProgramContent"

        type="java:com.harris.hrs.services.content.ProgramContent"

        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

        encodingStyle=""

      />

 

    <requestFlow name="checks">

      <handler
type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

      <handler
type="java:org.apache.axis.handlers.SimpleAuthorizationHandler"/>

    </requestFlow>

  </service>

 

</deployment> 

----------------------------------------------------------------------------
-------------------------------------------

 

Step 2: I used JavaToWSDL with the "-y RPC -u LITERAL" parameters to create
a new 'RPC/Lit' WSDL for the service.

Step 3: I used WSDLToJava to build client stubs from this 'RPC/Lit' WSDL
file.

 

I can now see the following reassuring settings in my new client
'SoapBindStub':

----------------------------------------------------------------------------
-------------------------------------------

        org.apache.axis.client.Call _call = createCall();

        _call.setOperation(_operations[0]);

        _call.setUseSOAPAction(true);

        _call.setSOAPActionURI("");

        _call.setEncodingStyle(null);

        _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR,
Boolean.FALSE);

        _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS,
Boolean.FALSE);

 
_call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);

        _call.setOperationName(new
javax.xml.namespace.QName("urn:TSMAdapter_RPC_Lit", "addUser")); 

----------------------------------------------------------------------------
-------------------------------------------

 

I have used the AXIS TCP monitor to check on the client's SOAP Request and
see the following, which matches the old RPC/Enc version BUT WITHOUT the
multiRefs & types:

----------------------------------------------------------------------------
-------------------------------------------

POST /TSMAdapter_RPC_Lit/services/TSMAdapter HTTP/1.0

Content-Type: text/xml; charset=utf-8

Accept: application/soap+xml, application/dime, multipart/related, text/*

User-Agent: Axis/1.1

Host: 127.0.0.1

Cache-Control: no-cache

Pragma: no-cache

SOAPAction: ""

Content-Length: 1826

Authorization: Basic bWVtdW06U2NvdHQxc2g=

 

<?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>

  <addUser xmlns="urn:TSMAdapter_RPC_Lit">

   <hUserDtls xmlns="">

    <item xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://xml.apache.org/xml-soap">

     <key>password</key>

     <value>p</value>

    </item>

    <item>

     <key>diskquota</key>

     <value>2048</value>

    </item>

    <item>

     <key>contextID</key>

     <value>qwerty1234_1113550647291</value>

    </item>

    <item>

     <key>userID</key>

     <value>qwerty1234</value>

    </item>

    <item>

     <key>notifyrecipients</key>

     <value>

      <item>0702630331@sms.dof.se</item>

     </value>

    </item>

    <item>

     <key>masteralias</key>

     <value>timothy.thorpe@dof.se</value>

    </item>

    <item>

     <key>givenname</key>

     <value>Timothy</value>

    </item>

    <item>

     <key>status</key>

     <value>ENABLED</value>

    </item>

    <item>

     <key>clientMSISDN</key>

     <value>46702630331</value>

    </item>

    <item>

     <key>alias</key>

     <value>

      <item>tim.thorpe@dof.se</item>

      <item>t.thorpe@dof.se</item>

     </value>

    </item>

    <item>

     <key>sn</key>

     <value>Thorpe</value>

    </item>

    <item>

     <key>cos</key>

     <value>2903</value>

    </item>

    <item>

     <key>migrate</key>

     <value>false</value>

    </item>

    <item>

     <key>aliasdomain</key>

     <value>dof.se</value>

    </item>

    <item>

     <key>domain</key>

     <value>pne.dof.mobile.se</value>

    </item>

    <item>

     <key>sievestatus</key>

     <value>ENABLED</value>

    </item>

   </hUserDtls>

  </addUser>

 </soapenv:Body>

</soapenv:Envelope>

----------------------------------------------------------------------------
-------------------------------------------

 

The TCP Monitor shows the following Fault being returned:

----------------------------------------------------------------------------
-------------------------------------------

HTTP/1.1 500 Internal Server Error

Content-Type: text/xml;charset=utf-8

Date: Fri, 15 Apr 2005 07:37:29 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/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 <soapenv:Body>

  <soapenv:Fault>

   <faultcode>soapenv:Server.userException</faultcode>

   <faultstring>org.xml.sax.SAXException: SimpleDeserializer encountered a
child element, which is NOT expected, in something it was trying to
deserialize.</faultstring>

   <detail/>

  </soapenv:Fault>

 </soapenv:Body>

</soapenv:Envelope>

----------------------------------------------------------------------------
-------------------------------------------

 

 

Timothy Thorpe

Consultant Software Engineer