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
Post a Comment