Я пытаюсь работать с JAXB и @XmlJavaTypeAdaptor для отображения карты во время сортировки.Единственная проблема, с которой я сталкиваюсь, заключается в том, что элементу item, используемому для хранения каждой записи на карте, присваивается пустое пространство имен.
Ниже приведен пример сгенерированного XML-документа, в котором показана проблема:
<format xmlns="myNamespace">
<data>
<item xmlns:ns2="myNamespace" xmlns="">
<ns2:key>Admin</ns2:key>
<ns2:value>John</ns2:value>
</item>
</data>
</format>
Я бы хотел, чтобы фрагмент выглядел так:
<format xmlns="myNamespace">
<data>
<item>
<key>Admin</key>
<value>John</value>
</item>
</data>
</format>
Я упростил пример из реальной жизни, чтобы сузить его до этого случая.Вот класс, который маршалируется:
@XmlRootElement(name = "format")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
public final class Format {
@XmlTransient
private final Map<String, String> data = new HashMap<String, String>();
@XmlJavaTypeAdapter(MapAdapter.class)
public Map<String, String> getData() {
return data;
}
}
Вот реализация XmlAdapter, которую я использую:
public class MapAdapter extends XmlAdapter<MapElements[], Map<String, String>> {
@Override
public MapElements[] marshal(Map<String, String> stringStringMap) throws Exception {
MapElements[] mapElements = new MapElements[stringStringMap.size()];
int i = 0;
for (Map.Entry<String, String> entry: stringStringMap.entrySet()) {
mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
}
return mapElements;
}
@Override
public Map<String, String> unmarshal(MapElements[] mapElements) throws Exception {
Map<String, String> map = new HashMap<String, String>();
for (MapElements mapElement : mapElements) {
map.put(mapElement.key, mapElement.value);
}
return map;
}
}
Я устанавливаю информацию об уровне пакета следующим образом, это помогает вчто он гарантирует, что пространство имен для всех элементов, кроме элементов "item", имеет пространство имен "myNamespace":
@XmlSchema(namespace = "myNamespace", elementFormDefault = XmlNsForm.QUALIFIED)
package org.prystasj;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
Я пробовал каждую комбинацию аннотаций, например, @XmlElement (namespace = "myNamespace"),Я могу думать обо всем, и нет никаких шансов, поэтому я думаю, что мне не хватает чего-то концептуального (или, может быть, даже чего-то довольно тривиального).
Я использую JAXB 2.2.2.
Заранее спасибо за любые идеи.