Возможно ли, чтобы JAXB (в Джерси JAX-RS) поддерживал java.util.HashMap для формата XML и JSON

Я использую реализацию JAX-RS для Джерси, чтобы создать службу RESTful. Я хочу, чтобы служба поддерживала ответы XML и JSON через очень удобную поддержку JAXB, встроенную в JAX-RS.

Все работает чудесно, пока я не попытаюсь использовать java.util.HashMap(ПРИМЕЧАНИЕ: вы не можете использовать интерфейсы с JAXB). Это удивило меня, что JAXB не поддерживает встроенную поддержку для карт в XML, хотя плагин Jackson JSON JAXB имеет поддержку.

Первая попытка:

@XmlElement(name = "Links")
HashMap<string, linkdto=""> links = new HashMap<string, linkdto="">();
</string,></string,>

Выход XML Пусто:

Выход JSON:

"Links": {
 "status": {
 ...
 },
 "cancel": {
 ...
 }
}

Итак, чтобы исправить эту проблему, я понял, что пользовательский XmlAdapter выполнит трюк, но это сломало сериализацию JSON.

Вторая попытка:

@XmlJavaTypeAdapter(HashMapAdapter.class)
@XmlElement(name = "Links")
HashMap<string, linkdto=""> links = new HashMap<string, linkdto="">();
public class HashMapAdapter extends XmlAdapter<mapelement, hashmap<string,="" linkdto="">> {
 public HashMap<string, linkdto=""> unmarshal(ArrayList<mapentrytype> jaxbDTO) throws Exception {
 ... mapping code ...
 }
 public MapElement marshal(HashMap<string, linkdto=""> map) throws Exception {
 ... mapping code ...
 }
}
public static class MapElement {
 @XmlElement(name = "Link")
 public List<mapentrytype> entries = new ArrayList<mapentrytype>();
}
public class MapEntryType {
 @XmlElement(name = "Key")
 public String key;
 @XmlElement(name = "Value")
 public RESTfulLinkDTO value;
}
</mapentrytype></mapentrytype></string,></mapentrytype></string,></mapelement,></string,></string,>

Выход XML теперь доступен:

<links>
 
 <key>status</key>
 <value> ... </value>
 
 
 <key>cancel</key>
 <value> ... </value>
 
</links>

Выход JSON больше не является действительной картой JavaScript:

"Links": {
 "Link": [
 {
 "Key": "status",
 "Value": {
 ...
 }
 },
 {
 "Key": "cancel",
 "Value": {
 ...
 }
 }
 ]
}

Есть ли какой-либо возможный способ получить данные HashMap для вывода в виде XML без нарушения выхода JSON? Мне все равно, каков конкретный макет для XML до тех пор, пока все данные присутствуют. Я бы предпочел решение JAXB для этой проблемы, но если есть конфигурация Джерси, которая ее исправит, я бы согласился на это.

1 ответ

Карты кажутся больным местом для JAXB.

Однако, если то, что вы делаете, довольно просто, существует довольно простое решение в виде аннотации @XmlElementWrapper.

Вот фрагмент кода из моего проекта:

@XmlElementWrapper(name="Parameters")
protected LinkedHashMap<string, string=""> parameters;
</string,>

Это создает XML, который выглядит примерно так:

<parameters>
 <entry>
 <key>key-value</key>
 <value>value</value>
 </entry>
 ...
</parameters>

Я не уверен, что это работает для всех реализаций. Я думаю, что это работает с JAXB, который поставляется с Джерси и ссылкой на JAXB.

Моя надежда заключается в том, что некоторые будущие пересмотры спецификации JAXB будут иметь лучшую поддержку для Карт. И я надеюсь, что кто-то напишет/опубликует достаточно подробную книгу о JAXB.

licensed under cc by-sa 3.0 with attribution.