如何使用jersey封送解组Map

vzgqcmou  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(351)

我见过很多例子,其中一个Map作为一个类中的对象传递,并用一个定制的xmljavaadapter进行注解,该适配器用于对Map进行编组/解编。但是我试图在post请求中传递一个map本身作为requestedentity,响应也作为map,而不是一个包含map的类,我可以看到很多解决方案。。
输入类(请求的实体):genericmap.java

  1. import java.util.HashMap;
  2. import javax.xml.bind.annotation.XmlRootElement;
  3. import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
  4. @XmlRootElement
  5. @XmlJavaTypeAdapter(GenericMapAdapter.class)
  6. public class GenericMap<K,V> extends HashMap<K,V> {
  7. }

genericmapadapter.java文件

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import java.util.Map.Entry;
  4. import javax.xml.bind.annotation.adapters.XmlAdapter;
  5. public class GenericMapAdapter<K, V> extends XmlAdapter<MapType<K,V>, Map<K,V>> {
  6. @Override
  7. public MapType marshal(Map<K,V> map) throws Exception {
  8. MapType<K,V> mapElements = new MapType<K,V>();
  9. for (Map.Entry<K, V> entry : map.entrySet()){
  10. MapElementsType<K,V> mapEle = new MapElementsType<K,V> (entry.getKey(),entry.getValue());
  11. mapElements.getEntry().add(mapEle);
  12. }
  13. return mapElements;
  14. }
  15. @Override
  16. public Map<K, V> unmarshal(MapType<K,V> arg0) throws Exception {
  17. Map<K, V> r = new HashMap<K, V>();
  18. K key;
  19. V value;
  20. for (MapElementsType<K,V> mapelement : arg0.getEntry()){
  21. key =mapelement.key;
  22. value = mapelement.value;
  23. r.put(key, value);
  24. }
  25. return r;
  26. }
  27. }

Map类型.java

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Map;
  4. import javax.xml.bind.annotation.XmlRootElement;
  5. @XmlRootElement
  6. public class MapType<K, V> {
  7. private List<MapElementsType<K, V>> entry = new ArrayList<MapElementsType<K, V>>();
  8. public MapType() {
  9. }
  10. public MapType(Map<K, V> map) {
  11. for (Map.Entry<K, V> e : map.entrySet()) {
  12. entry.add(new MapElementsType<K, V>(e.getKey(),e.getValue()));
  13. }
  14. }
  15. public List<MapElementsType<K, V>> getEntry() {
  16. return entry;
  17. }
  18. public void setEntry(List<MapElementsType<K, V>> entry) {
  19. this.entry = entry;
  20. }
  21. }

mapelementstype.java文件

  1. import javax.xml.bind.annotation.XmlElement;
  2. import javax.xml.bind.annotation.XmlRootElement;
  3. @XmlRootElement
  4. public class MapElementsType<K,V>
  5. {
  6. @XmlElement public K key;
  7. @XmlElement public V value;
  8. public MapElementsType() {} //Required by JAXB
  9. public MapElementsType(K key, V value)
  10. {
  11. this.key = key;
  12. this.value = value;
  13. }
  14. }

当我将genericmap作为类的成员变量并用genericmapadapter对其进行注解时,它工作得很好。但是,我希望genericmap本身作为输入请求实体传递。当我尝试这样做时,我在日志中看到一个空的xml请求和400个错误的请求:

zf9nrax1

zf9nrax11#

我认为解决问题的方法是不使用jaxb,而是手动Map请求参数或响应:
在jersey中,如何使一些方法使用pojoMap特性,而另一些方法不使用pojoMap特性?

相关问题