发送列表地图作为POST参数jersey

发送列表地图作为POST参数jersey,第1张

发送列表/地图作为POST参数jersey

只是为了清除一些东西。本

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服务。您还可以使实现更加通用。希望这可以帮助。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5479000.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存