[英]How to marshal unmarshal a Map using Jersey
我已經看到了很多示例,其中Map作為類中的對象傳遞,並使用自定義XMLJavaAdapter進行批注,該XMLJavaAdapter用於對Map進行編組/解組。 但是我試圖在POST請求中將Map本身作為requestEntity傳遞,並將響應也作為Map傳遞,而不是將包含Map的類傳遞給我,因此我可以看到很多解決方案。
輸入類別(請求的實體): GenericMap.java
import java.util.HashMap;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlJavaTypeAdapter(GenericMapAdapter.class)
public class GenericMap<K,V> extends HashMap<K,V> {
}
GenericMapAdapter.java
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class GenericMapAdapter<K, V> extends XmlAdapter<MapType<K,V>, Map<K,V>> {
@Override
public MapType marshal(Map<K,V> map) throws Exception {
MapType<K,V> mapElements = new MapType<K,V>();
for (Map.Entry<K, V> entry : map.entrySet()){
MapElementsType<K,V> mapEle = new MapElementsType<K,V> (entry.getKey(),entry.getValue());
mapElements.getEntry().add(mapEle);
}
return mapElements;
}
@Override
public Map<K, V> unmarshal(MapType<K,V> arg0) throws Exception {
Map<K, V> r = new HashMap<K, V>();
K key;
V value;
for (MapElementsType<K,V> mapelement : arg0.getEntry()){
key =mapelement.key;
value = mapelement.value;
r.put(key, value);
}
return r;
}
}
MapType.java
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class MapType<K, V> {
private List<MapElementsType<K, V>> entry = new ArrayList<MapElementsType<K, V>>();
public MapType() {
}
public MapType(Map<K, V> map) {
for (Map.Entry<K, V> e : map.entrySet()) {
entry.add(new MapElementsType<K, V>(e.getKey(),e.getValue()));
}
}
public List<MapElementsType<K, V>> getEntry() {
return entry;
}
public void setEntry(List<MapElementsType<K, V>> entry) {
this.entry = entry;
}
}
MapElementsType.java
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class MapElementsType<K,V>
{
@XmlElement public K key;
@XmlElement public V value;
public MapElementsType() {} //Required by JAXB
public MapElementsType(K key, V value)
{
this.key = key;
this.value = value;
}
}
當我將genericmap用作類的成員變量並用GenericMapAdapter對其進行注釋時,它可以正常工作。 但是,我希望將GenericMap本身作為輸入請求的實體傳遞。 當我嘗試這樣做時,我在日志中看到一個空的xml請求,並看到400 Bad Request:
我認為解決問題的方法是不使用JAXB,而是手動映射請求參數或響應:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.