java - Pass a HashMap<String,Object> over SOAP using JAXB -


i trying pass hashmap on soap. using cxf wsdl2java create schema. , have created wrapper class hashmap since hashmap cannot passed on line.

i have created adapters morph hashmap known type wsdl when wsdl created adds unneeded abstract map. below code:

here wrapper class hashmap

@xmlrootelement(name = "testto") public class testto {      private hashmap<string, object> maptest;      public testto(){         this.maptest = new hashmap<string, object>();     }      @xmljavatypeadapter(mapadapter.class)     public hashmap<string, object> getmaptest() {         return maptest;     }      public void setmaptest(hashmap<string, object> maptest) {         this.maptest = maptest;     }  } 

here mymap class in known schema type

@xmljavatypeadapter(mapadapter.class) public class mymap extends hashmap<string, object>{     public final list<entry> entrylist = new arraylist<entry>(); } 

this entry class in list contains above:

public class entry {      @xmlattribute     public string key;      @xmlelements({             @xmlelement(name = "byte", type = byte.class),             @xmlelement(name = "short", type = short.class),             @xmlelement(name = "int", type = int.class),             @xmlelement(name = "long", type = long.class),             @xmlelement(name = "float", type = float.class),             @xmlelement(name = "double", type = double.class),             @xmlelement(name = "char", type = char.class),             @xmlelement(name = "boolean", type = boolean.class),              @xmlelement(name = "bytewrapper", type = byte.class),             @xmlelement(name = "shortwrapper", type = short.class),             @xmlelement(name = "integerwrapper", type = integer.class),             @xmlelement(name = "longwrapper", type = long.class),             @xmlelement(name = "floatwrapper", type = float.class),             @xmlelement(name = "doublewrapper", type = double.class),             @xmlelement(name = "character", type = character.class),             @xmlelement(name = "booleanwrapper", type = boolean.class),              @xmlelement(name = "bigdecimal", type = bigdecimal.class),             @xmlelement(name = "string", type = string.class),             @xmlelement(name = "date", type = date.class)     })     public object value;      public entry() {         this.key = null;         this.value = null;     }      public entry(string key, object value) {         this.key = key;         this.value = value;     }      public string getkey() {         return key;     }      public object getvalue() {         return value;     }  } 

this adapter:

public class mapadapter extends xmladapter<mymap, map<string, object>> {      @override     public mymap marshal(map<string, object> v) throws exception {         mymap mymap = new mymap();          ( map.entry<string, object> e : v.entryset() ) {             entry entry = new entry();             entry.key = e.getkey();             entry.value = e.getvalue();              mymap.entrylist.add(entry);         }         return mymap;     }      @override     public map<string, object> unmarshal(mymap v) throws exception {          map<string, object> map = new hashmap<string,object>();             ( entry e : v.entrylist ) {                 map.put(e.key, e.value);             }      return map;     }  } 

but wsdl generating following:

<xs:element minoccurs="0" name="foo" type="tns:testto"/> </xs:sequence> </xs:complextype> <xs:complextype name="testto"> <xs:sequence> <xs:element minoccurs="0" name="maptest" type="tns:mymap"/> </xs:sequence> </xs:complextype> <xs:complextype name="mymap"> <xs:complexcontent> <xs:extension base="tns:hashmap"> <xs:sequence> <xs:element maxoccurs="unbounded" minoccurs="0" name="entrylist" nillable="true" type="tns:entry"/> </xs:sequence> </xs:extension> </xs:complexcontent> </xs:complextype> <xs:complextype name="hashmap"> <xs:complexcontent> <xs:extension base="tns:abstractmap"> <xs:sequence/> </xs:extension> </xs:complexcontent> </xs:complextype> <xs:complextype abstract="true" name="abstractmap"> <xs:sequence/> </xs:complextype> <xs:complextype name="entry"> <xs:sequence> <xs:choice minoccurs="0"> <xs:element name="byte" type="xs:byte"/> <xs:element name="short" type="xs:short"/> <xs:element name="int" type="xs:int"/> <xs:element name="long" type="xs:long"/> <xs:element name="float" type="xs:float"/> <xs:element name="double" type="xs:double"/> <xs:element name="char" type="xs:unsignedshort"/> <xs:element name="boolean" type="xs:boolean"/> <xs:element name="bytewrapper" type="xs:byte"/> <xs:element name="shortwrapper" type="xs:short"/> <xs:element name="integerwrapper" type="xs:int"/> <xs:element name="longwrapper" type="xs:long"/> <xs:element name="floatwrapper" type="xs:float"/> <xs:element name="doublewrapper" type="xs:double"/> <xs:element name="character" type="xs:unsignedshort"/> <xs:element name="booleanwrapper" type="xs:boolean"/> <xs:element name="bigdecimal" type="xs:decimal"/> <xs:element name="string" type="xs:string"/> <xs:element name="date" type="xs:datetime"/> </xs:choice> </xs:sequence> <xs:attribute name="key" type="xs:string"/> </xs:complextype> 

i have looked @ multiple other cases have found here , none of them able solve problem have referenced http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/xmladapter.html wsdl java seems messing schema up.

thanks.

i believe don't have write custom xmladapter marshall/unmarshall map<string, object newest jaxb versions. below sample works fine me.

@xmlaccessortype(xmlaccesstype.field) @xmltype(name = "foo") public class foo {   private map<string, object> map = new hashmap<string, object>();    public map<string, object> getmap() {     return params;   } } 

this resulted in schema:

<xs:complextype name="foo">   <xs:sequence>     <xs:element name="map">       <xs:complextype>         <xs:sequence>           <xs:element maxoccurs="unbounded" minoccurs="0" name="entry">             <xs:complextype>               <xs:sequence>                 <xs:element minoccurs="0" name="key" type="xs:string"/>                 <xs:element minoccurs="0" name="value" type="xs:anytype"/>               </xs:sequence>             </xs:complextype>           </xs:element>         </xs:sequence>       </xs:complextype>     </xs:element>   </xs:sequence> </xs:complextype> 

then should able unmarshall following xml:

<soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://your.org/" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:xs="http://www.w3.org/2001/xmlschema">    <soapenv:header/>    <soapenv:body>       <foo>         <params>             <entry>                <key>string</key>                <value xsi:type="xs:string">5</value>              </entry>              <entry>                 <key>integer</key>                 <value xsi:type="xs:int">54</value>              </entry>         </params>       </foo>    </soapenv:body> </soapenv:envelope> 

just don't forget xs , xsi namespaces. can pass custom types values not simple xsi types. have make sure have specified proper xsi:type.


Comments

Popular posts from this blog

node.js - Bad Request - node js ajax post -

Why does Ruby on Rails generate add a blank line to the end of a file? -

keyboard - Smiles and long press feature in Android -