只是为了清除一些东西。本
MultivaluedMap<String, String>是为了用于获得通过的HTTP
POST请求提交到您的服务形式参数如参数一般地图。应该这样使用:
@POST @Consumes("application/x-www-form-urlenpred") public void post(MultivaluedMap<String, String> formParams) { // Store the message }
但是,当您的客户端应用程序需要向REST服务提供某种数据(在您的情况下
HashMap,我想包含很多重要信息)时,它将首先将其序列化为XML,然后将其发送到该服务,然后反序列化并用它。不幸的是,Jersey无法自动编组/
unmmarshal,
HashMap因此,如果您仅
HashMap在
newProj方法中提供了参数,则会出现异常。
那么如何将HashMap发送到您的服务呢?好吧,关键是JAXB
@XmlRootElement和自定义
XmlAdapter:-)
首先,您需要为地图编写自己的包装器。包装器将带有注释
@XmlRootElement
@XmlRootElementpublic class MyHashMapObject<T, U> { private Map<T, U> mapProperty; public MyHashMapObject() { mapProperty = new HashMap<T, U>(); } @XmlJavaTypeAdapter(MapAdapter.class) // NOTE: Our custom XmlAdaper public Map<T, U> getMapProperty() { return mapProperty; } public void setMapProperty(Map<T, U> map) { this.mapProperty = map; }}
然后,您需要定义“启用了JAXB”的地图元素:
public class MapElement { @XmlElement public String key; @XmlElement public String value; private MapElement() { } public MapElement(String key, String value) { this.key = key; this.value = value; }}
最后定义您的自定义XmlAdapter:
public class MapAdapter extends XmlAdapter<MapElement[], Map<String, String>> { public MapElement[] marshal(Map<String, String> arg0) throws Exception { MapElement[] mapElements = new MapElement[arg0.size()]; int i = 0; for (Map.Entry<String, String> entry : arg0.entrySet()) mapElements[i++] = new MapElement(entry.getKey(), entry.getValue()); return mapElements; } public Map<String, String> unmarshal(MapElement[] arg0) throws Exception { Map<String, String> r = new HashMap<String, String>(); for (MapElement mapelement : arg0) r.put(mapelement.key, mapelement.value); return r; }}
一旦所有这些都就绪(必须由您的服务和客户端使用,因此将其放入一个碎片罐中),就可以像下面这样定义您的服务:
@Path("/hello")public class FormResource{ //@GET @POST @Produces(MediaType.APPLICATION_XML) @Consumes(MediaType.APPLICATION_XML) public MyHashMapObject<String, String> post( MyHashMapObject<String, String> anotherMap) { anotherMap.getMapProperty().put("e", "10"); anotherMap.getMapProperty().put("f", "11"); anotherMap.getMapProperty().put("g", "12"); return anotherMap; }}
你们都准备好了。您的客户应该这样:
public class Test { public static void main(String[] args) { ClientConfig config = new DefaultClientConfig(); Client client = Client.create(config); WebResource service = client.resource(getbaseURI()); // Now do the MAP stuff MyHashMapObject<String, String> map = new MyHashMapObject<String, String>(); map.getMapProperty().put("a", "1"); map.getMapProperty().put("b", "2"); ClientResponse response = service.path("rest").path("hello2") .type(MediaType.APPLICATION_XML) .accept(MediaType.APPLICATION_XML) .post(ClientResponse.class, map); Map<String, String> myMap = response.getEntity(MyHashMapObject.class).getMapProperty(); for(Map.Entry<String, String> entry : myMap.entrySet()) System.out.format("Key: %s, Value: %sn", entry.getKey(), entry.getValue()); } private static URI getbaseURI() { return UriBuilder.fromUri( "http://localhost:8080/org.nowaq.jersey.first").build(); } }
现在,您可以轻松地将您的数据传递
HashMap<String, String>给REST服务。您还可以使实现更加通用。希望这可以帮助。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)