(泽西+杰克逊)XmlAdapter

时间:2012-04-09 04:33:09

标签: jaxb jersey jackson xmladapter

我有一个Foo类,它有一个变量Map条。但作为一项要求,我需要能够将其表示为对象。

所以我使用GenericXmlAdapter,它依次执行instanceof检查并调用Map适配器。 MapAdapter将Map转换为MapElementList,它只是Map元素的List。

代码根据需要落实,即调用GenericXmlAdapter并返回MapElementList。

但后来我得到了臭名昭着的类MapElementList,其上下文中也没有任何超类错误

部分进展:在Foo或任何其他需要序列化的类中未引用MapAdapter。所以MapAdapter中的@XmlSeeAlso也无济于事。我需要在其他地方添加它。哪里?是个问题。在GenericXmlAdapter中添加它没有帮助。

快速浏览代码

class Foo{
   private Object bar;

   @XmlJavaAdapter(GenericAdapter.class)
   @XmlElement(name="bar")
   public Object getBar(){
      return bar;
   }
}

杰克逊按预期调用以下GenericAdapter

class GenericAdapter extends XmlAdapter<Object,Object>{
   public Object marshall(Object v){
      final XmlAdapter adapter = getAppropriateAdapter(v);
      return adapter.marshall(v);
   }

   public Object unmarshall(Object v){
      final XmlAdapter adapter = getAppropriateAdapter(v);
      return adapter.unmarshall(v);
   }

   public XmlAdapter getAppropriateAdater(Object v){
      if(v instanceof Map){
         return MapAdapter();
      }
   }
}

GenericAdapter按预期调用以下MapAdapter

@XmlSeeAlso({ MapElement.class, MapElementList.class })
class MapAdapter<K,V> extends XmlAdapter<MapElementList<K,V>, Map<K,V>>{
   public MapElementList<K,V> marshall(Map<K,V> map){
      return new MapElementList(map);
   }

   public Map<K,V> unmarshall(MapElementList list){
      ...
   }
}

以下MapElementList是Map

的列表表示
class MapElementList<K,V>{
   @XmlAnyElement
   private ArrayList<MapElement<K,V> list;

   //Getters and setters
}

以下是最终的MapElement

class MapElement<K,V>{
   @XmlAnyElement
   private K key;

   @XmlAnyElement
   private V value;

   //Getters and setters WITHOUT any annotations
}

0 个答案:

没有答案