You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Kent Närling <ke...@seamless.se> on 2009/05/20 16:05:57 UTC
Problem with java.util.Hashtable as a webservice parameter?
We have a problem getting Hashtable parameters getting passed properly
in a webservice request, for instance I created a test method like:
@WebMethod(operationName="doSomething")
Hashtable<String, String> doSomething(
@WebParam(name="action") String action,
@WebParam(name="extraFields") Hashtable<String, String> extraFields);
And then try to call this from a client with:
Hashtable<String, String> extraFields = new Hashtable<String, String>();
extraFields.put("profileId", "42");
Hashtable<String, String> result = link.doSomething("GO", extraFields);
System.err.println("result[text]= " + result.get("text"));
And a test server implementation:
System.err.println("action = " + action + " profileId = " +
extraFields.get("profileId"));
Hashtable<String, String> result = new Hashtable<String, String>();
result.put("text", "TEST");
return result;
But the printouts just become:
(server) action = GO profileId = null
(client) result[text]= null
And the actual data sent in the request is just:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:doSomething
xmlns:ns2="http://ersifextlink.interfaces.ers.seamless.com/"><action>GO</action><extraFields/></ns2:doSomething></soap:Body></soap:Envelope>
The funny thing is that if we wrap the parameter in our own class
CONTAINING a java.util.Hashtable, then it seems to WORK?!?
Any hints? are we missing some information in the annotations? or is
this a CXF specific issue?
Re: Problem with java.util.Hashtable as a webservice parameter?
Posted by Daniel Kulp <dk...@apache.org>.
Is this with Aegis databinding or JAXB?
JAXB doesn't really support Hashtables or maps or anything "natively". If
you create a service with it and check the schema, you get a complexType named
"hashtable" that extends a complexType named "dictionary" which is just an
empty sequence. Not really useful.
However, you CAN get it to work if you write a custom XmlAdapter. The
java_first_jaxws sample that we ship in CXF contains an example of writing an
adapter to handle a Map. You should be able to use that as a starting point.
Dan
On Wed May 20 2009 10:05:57 am Kent Närling wrote:
> We have a problem getting Hashtable parameters getting passed properly
> in a webservice request, for instance I created a test method like:
>
> @WebMethod(operationName="doSomething")
> Hashtable<String, String> doSomething(
> @WebParam(name="action") String action,
> @WebParam(name="extraFields") Hashtable<String, String> extraFields);
>
>
> And then try to call this from a client with:
>
> Hashtable<String, String> extraFields = new Hashtable<String, String>();
> extraFields.put("profileId", "42");
> Hashtable<String, String> result = link.doSomething("GO", extraFields);
> System.err.println("result[text]= " + result.get("text"));
>
> And a test server implementation:
>
> System.err.println("action = " + action + " profileId = " +
> extraFields.get("profileId"));
>
> Hashtable<String, String> result = new Hashtable<String, String>();
> result.put("text", "TEST");
> return result;
>
>
> But the printouts just become:
> (server) action = GO profileId = null
> (client) result[text]= null
>
> And the actual data sent in the request is just:
> <soap:Envelope
> xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:doSo
>mething
> xmlns:ns2="http://ersifextlink.interfaces.ers.seamless.com/"><action>GO</ac
>tion><extraFields/></ns2:doSomething></soap:Body></soap:Envelope>
>
> The funny thing is that if we wrap the parameter in our own class
> CONTAINING a java.util.Hashtable, then it seems to WORK?!?
>
> Any hints? are we missing some information in the annotations? or is
> this a CXF specific issue?
--
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog