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 Claudia Mavilio <cl...@seceti.it> on 2005/05/05 11:50:21 UTC

R: HashMap of HashMaps

Hello Everybody,

I have the same Lyndon's problem, because I deploy a java webservice
that incapsulate response data into a Hashmap (whose name is "dati",
please see below) using a wsdd file.
The kind of response data into the Hashmap is of type "Costruttore" and
doesn't appear in wsdl file, so the generation of stub and
deserialization classes fails.
Follow a snippet of mi wsdl file and a copy of the wsdd file.
Thanks in advance for any help!!!

Claudia

----------------------------------------------------------------
FILE WSDD:

<service name="Costruttori" provider="java:RPC">
  <parameter name="className"
value="it.seceti.coc.service.ws.jaxrpc.CostruttoriJaxRpc"/>
  <parameter name="allowedMethods" value="*"/>
	<beanMapping qname="coc:BaseObject" xmlns:coc="urn:coc"
languageSpecificType="java:org.appfuse.model.BaseObject"/>
	<beanMapping qname="coc:Costruttore" xmlns:coc="urn:coc"
languageSpecificType="java:it.seceti.coc.model.Costruttore"/>
	<beanMapping qname="coc:IDOperatore" xmlns:coc="urn:coc"
languageSpecificType="java:it.seceti.coc.model.IDOperatore"/>
	<beanMapping qname="coc:Esito" xmlns:coc="urn:coc"
languageSpecificType="java:it.seceti.coc.model.esito.Esito"/>
	<beanMapping qname="coc:RisultatoOperazione" xmlns:coc="urn:coc"
languageSpecificType="java:it.seceti.coc.model.esito.RisultatoOperazione
"/>
	<beanMapping qname="coc:Locale" xmlns:coc="urn:coc"
languageSpecificType="java:it.seceti.coc.model.esito.Locale"/>
  <parameter name="wsdlServiceElement" value="CostruttoriService"/>
  <parameter name="wsdlServicePort" value="Costruttori"/>
  <parameter name="wsdlPortType" value="Costruttori"/>
 </service>
----------------------------------------------------------------------
SNIPPET OF WSDL FILE:

.......
complexType name="Esito">

- <sequence>

  <element name="dati" nillable="true" type="apachesoap:Map" /> 

  <element name="risultatoOperazione" nillable="true"
type="tns1:RisultatoOperazione" /> 

  </sequence>

  </complexType>

  </schema>

..............

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



Subject:    HashMap of HashMaps
From:       Lyndon Tiu <ltiu () alumni ! sfu ! ca>
Date:       2004-11-23 22:03:12
Message-ID: <200411232203.iANM3CO2010215 () rm-rstar ! sfu ! ca>
[Download message RAW]

Hello,

I have a custom object I am trying to pass across the wire using AXIS
wrapped style \
document-literal service.

The complex object contains a HashMap of HashMaps (that is, the values
of the \
HashMap, are HashMaps themselves).  For reference, I have called this
complex object \
"ExternalDataWrapper".

I have used the Java2WSDL tool to generate the WSDL for this class by
supplying the \
Interface.  Of course, the Interface does not specify that the HashMap's
values will \
contain HashMaps, so it seems that the WSDL generated declares that the
"type" of the \
value components of my HashMap will contain an "xsd:string".  A portion
of the WSDL \
follows:

<schema targetNamespace="http://xml.apache.org/xml-soap"  \
xmlns="http://www.w3.org/2001/XMLSchema"> <complexType name="mapItem">
  <sequence>
    <element name="key" nillable="true" type="xsd:string" /> 
    <element name="value" nillable="true" type="xsd:string" /> 
  </sequence>
</complexType>
<complexType name="Map">
    <sequence>
      <element maxOccurs="unbounded" minOccurs="0" name="item" \
type="apachesoap:mapItem" />   </sequence>
  </complexType>
</schema>
<schema targetNamespace="http://beans.xdb.geocortex.net" \
xmlns="http://www.w3.org/2001/XMLSchema">  <complexType
name="ExternalDataWrapper">
    <sequence>
      <element name="data" nillable="true" type="apachesoap:Map" /> 
    </sequence>
  </complexType>
.
.
.

I then used the WSDL2Java tool to generate the client stubs, server
skeletons and \
bindings, and the .wsdd files.  When I make a request to my webservice
(which should \
return my complex object), I construct the HashMap of HashMaps in the
Web Service \
implementation class.  The response is serialized correctly as follows:
\
<soapenv:Envelope .....>  <soapenv:Body>
    <getDataResponse xmlns="my.namespace">
      <getDataReturn xmlns="">
        <data>
          <item
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" \
xmlns:nsl="http://xml.apache.org/xml-soap">  <key>123</key>
            <value>
              <item>
                 <key>OWNER</key>
                 <value>Miller</value>
              </item>
              <item>
                 <key>AGE</key>
                 <value>42</value>
              </item>
              .
              .
            </value>
          </item>
          <item>
            <key>456</key>
            <value>
               <item>
                .
                .
                .
         </data>
       </getDataReturn>
     </getDataResponse>
  </soapenv:Body>
</soapenv:Envelope>    


The problem is, that the client side does not seem to be able to
deserialize my \
ojbect correctly.  Perhaps it is expecting a string as the values of the
HashMap as \
opposed to HashMaps.

It is giving me this error:
org.xml.sax.SAXException: SimpleDeserializer encountered a child
element, which is \
NOT expected, in something it was trying to deserialize.

My question is: Why can this object be seeminly serialized correctly if
it can not be \
deserialized?   Is deserializing multidimentional HashMaps a limitation
of the Axis \
deserializers?

Any suggestions would be appreciated.

Thanks for your time.



--
Lyndon Tiu


=== Start-of Internet E-mail Confidentiality Footer ===

L'uso non autorizzato di questo messaggio o dei suoi allegati e' vietato e potrebbe costituire reato.
Se ha ricevuto per errore questo messaggio, La preghiamo di informarci e di distruggerlo immediatamente coi suoi allegati.
Le dichiarazioni contenute in questo messaggio o nei suoi allegati non impegnano SECETI S.p.A. nei confronti del destinatario o di terzi.
SECETI S.p.A. non si assume alcuna responsabilita' per eventuali intercettazioni, modifiche o danneggiamenti del presente messaggio.

Any unauthorized use of this e-mail or any of its attachments is prohibited and could constitute an offence.
If you are not the intended addressee please advise immediately the sender and destroy the message and its attachments.
The contents of this message shall be understood as neither given nor endorsed by SECETI S.p.A.
SECETI S.p.A. does not accept liability for corruption, interception or amendment, if any, or the consequences thereof.