2 Stimmen

JAXB und leerer Namensraum bei Verwendung von @XmlJavaTypeAdapter zum Zuordnen einer Map

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.

2voto

bdoughan Punkte 144925

Sie könnten Folgendes für Ihren XmlAdapter verwenden

import java.util.*;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class MapAdapter extends XmlAdapter> {

    @Override
    public MapElements marshal(Map stringStringMap) throws Exception {
        MapElements mapElements = new MapElements();
        for (Map.Entry entry: stringStringMap.entrySet()) {
            mapElements.item.add(new MapElement(entry.getKey(), entry.getValue()));
        }
        return mapElements;
    }

    @Override
    public Map unmarshal(MapElements mapElements) throws Exception {
        Map map = new HashMap();
        for (MapElement mapElement : mapElements.item) {
            map.put(mapElement.key, mapElement.value);
        }
        return map;
    }

    public static class MapElements {
        public List item = new ArrayList();
    }

    public static class MapElement {
        public String key;
        public String value;

        public MapElement() {
        }

        public MapElement(String key, String value) {
            this.key = key;
            this.value = value;
        }

    }

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X