Ich versuche, mit JAXB und @XmlJavaTypeAdaptor zu arbeiten, um eine Map während des Marshalling abzubilden. Das einzige Problem, das ich habe, ist, dass das "item"-Element, das jedes Element in der Map enthält, einen leeren Namespace erhält.
Im Folgenden ist ein Beispiel für ein generiertes XML-Dokument, das das Problem zeigt:
Admin
John
Ich möchte, dass das Fragment wie folgt aussieht:
Admin
John
Ich habe das Beispiel im echten Leben vereinfacht, um es nur auf diesen Fall zu beschränken. Hier ist die Klasse, die gemarshallt wird:
@XmlRootElement(name = "format")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
public final class Format {
@XmlTransient
private final Map data = new HashMap();
@XmlJavaTypeAdapter(MapAdapter.class)
public Map getData() {
return data;
}
}
Hier ist die Implementierung von XmlAdapter, die ich verwende:
public class MapAdapter extends XmlAdapter> {
@Override
public MapElements[] marshal(Map stringStringMap) throws Exception {
MapElements[] mapElements = new MapElements[stringStringMap.size()];
int i = 0;
for (Map.Entry entry: stringStringMap.entrySet()) {
mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
}
return mapElements;
}
@Override
public Map unmarshal(MapElements[] mapElements) throws Exception {
Map map = new HashMap();
for (MapElements mapElement : mapElements) {
map.put(mapElement.key, mapElement.value);
}
return map;
}
}
Ich habe die Paketebeneinformationen wie folgt festgelegt, dies hilft zwar, indem es sicherstellt, dass der Namespace für alle Elemente außer den "item"-Elementen den Namespace "myNamespace" haben:
@XmlSchema(namespace = "myNamespace", elementFormDefault = XmlNsForm.QUALIFIED)
package org.prystasj;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
Ich habe jede Kombination von Annotationen, z.B. @XmlElement(namespace="myNamespace"), durchprobiert, die mir einfällt, und es gibt keine Chance, also denke ich, dass ich etwas Konzeptionelles (oder vielleicht sogar etwas ziemlich Triviales) übersehe.
Ich benutze JAXB 2.2.2.
Vielen Dank im Voraus für jede Einsicht.