JAXB und Maps -> Marshalling-Problem

kidsos

Aktives Mitglied
Hallo,

ich baue mir zur Zeit eine Anwendung zusammen, die mit XML-Daten operiert. Dabei habe ich folgendes Grundgerüst:
Java:
@XmlRootElement(name = "jobApplications")
@XmlAccessorType(XmlAccessType.NONE)
public class ApplicationList {

	private Map<String, ApplicationItem> itemHashMap;

	public ApplicationList() {
		itemHashMap = new HashMap<String, ApplicationItem>();
	}

	public void setItemHashMap(Map<String, ApplicationItem> itemHashMap) {
		this.itemHashMap = itemHashMap;
	}

	@XmlJavaTypeAdapter(CompanyListAdapter.class)
	@XmlElement(name = "company")
	public Map<String, ApplicationItem> getItemHashMap() {
		return itemHashMap;
	}
}
Java:
@XmlAccessorType(XmlAccessType.NONE)
public class ApplicationItem {
	private String id;

	public ApplicationItem() {
	}

	@XmlAttribute
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
}
Da das Marshalling bzw. Unmarshalling von Maps ja so nicht direkt geht, habe ich mir dazu eine Adapter-Klasse erstellt, die folgendermaßen aussieht:
Java:
public class CompanyListAdapter extends
		XmlAdapter<ArrayList<ApplicationItem>, Map<String, ApplicationItem>> {

	@Override
	public ArrayList<ApplicationItem> marshal(Map<String, ApplicationItem> value)
			throws Exception {
		ArrayList<ApplicationItem> itemList = new ArrayList<ApplicationItem>();
		for(Map.Entry<String, ApplicationItem> e : value.entrySet())
			itemList.add(e.getValue());
		return itemList;
	}

	@Override
	public Map<String, ApplicationItem> unmarshal(
			ArrayList<ApplicationItem> value) throws Exception {
		Map<String, ApplicationItem> map = new HashMap<String, ApplicationItem>();
		for (ApplicationItem c : value)
			map.put(c.getId(), c);
		return map;
	}
}
Ich bin dabei nach diesem Beispiel vorgegangen.

Nach der XML-Erstellung erhalte ich jedoch folgende Datei:
Code:
<jobApplications>
    <company/>
</jobApplications>
Ziel des Adaptierens soll jedoch folgende XML-Struktur sein:
Code:
<jobApplications>
    <company id="0">
    </company>
    <company id="1">
    </company>
    usw.
</jobApplications>
Die Klassen habe ich übrigens nur auf das notwendigste reduziert, damit es hier etwas übersichtlicher sein soll.

Wo liegt denn da jetzt mein Denkfehler?

Ich bedanke mich schon mal im Voraus bei Euch!
 

kidsos

Aktives Mitglied
Schade, dass bis jetzt noch keiner geantwortet hat! :(

Naja, ich weiß jetzt wenigstens, warum die Adapter-Klasse die Einträge nicht reinschreiben bzw. lesen kann. Ich habe da probehalber mal die
Code:
@XmlJavaTypeAdapter(CompanyListAdapter.class)
-Annotation in den Klassenkopf von der ApplicationList-Klasse gesteckt. Damit das klappt, musste ich noch die Sichtbarkeit auf
Code:
@XmlAccessorType(XmlAccessType.FIELD)
ändern und das
Code:
@XmlElement(name = "company")
löschen, sonst wirft der Compiler eine Exception. Als Ergebnis habe ich dann folgende XML-Struktur erhalten:
Code:
<jobApplications>
    <itemHashMap>
        <entry>
            <key>0</key>
            <value id="0">
                hier der entsprechende Eintrag
            </value>
        </entry>
    </itemHashMap>
</jobApplications>
Wie man sieht, wrappt der um den Key-Value-Eintrag noch ein Entry-Element dazu. Und da wird wohl der Fehler liegen. Die Adapter-Klasse sieht nur das Entry-Element und kann dadurch nicht die Liste schreiben bzw. lesen.

Die entscheidende Frage ist: Wie kann man das umgehen? ???:L

Was ich da noch bemerkt habe, ist die Sache, dass ich bei Verwendung von
Code:
@XmlJavaTypeAdapter(CompanyListAdapter.class)
im Klassenkopf die Klassenattribute (wie z.B. "itemHashMap") nicht mehr ala
Code:
@XmlElement(name = "company")
modifizieren kann. Für mich ist diese Lösung nicht brauchbar: XML-Datei wird zu unübersichtlich und ich habe keine Kontrolle über die Element-Name.

Günstiger ist da wahrscheinlich die Methode aus dem ersten Post, aber da ist auch die Frage: Wie kann ichs lösen?
 

kidsos

Aktives Mitglied
Der Tipp hat mir schon mal sehr geholfen. Das Schreiben funktioniert jetzt prima und die XML-Datei hat die gewünschte Struktur.

Probleme bereitet mir jetzt nur noch das Lesen. Aktueller Stand der ApplicationList-Klasse ist folgender:
Java:
@XmlRootElement(name = "jobApplications")
@XmlAccessorType(XmlAccessType.NONE)
public class ApplicationList {

	private Map<String, ApplicationItem> itemHashMap;

	public ApplicationList() {
		itemHashMap = new HashMap<String, ApplicationItem>();
	}

	public void setItemHashMap(Map<String, ApplicationItem> itemHashMap) {
		this.itemHashMap = itemHashMap;
	}

	public Map<String, ApplicationItem> getItemHashMap() {
		return itemHashMap;
	}
	
	@XmlElement(name="company")
	private ArrayList<ApplicationItem> getXmpApplicationList(){
		ArrayList<ApplicationItem> appList = new ArrayList<ApplicationItem>();
		
		for (String id : itemHashMap.keySet()){
			appList.add(itemHashMap.get(id));
		}
		return appList;
	}

	private void setXmpApplicationList(ArrayList<ApplicationItem> replacements) {
		itemHashMap.clear();
		for (ApplicationItem c : replacements){
			itemHashMap.put(c.getId(), c);
		}
	}
}
Gelesen wird die Datei so (wie üblich):
Java:
JAXBContext context = JAXBContext.newInstance(ApplicationList.class);
Unmarshaller um = context.createUnmarshaller();
ApplicationList list = (ApplicationList) um.unmarshal( new FileReader( "job-applications.xml" ) );
Mir ist klar, dass beim Initialisieren von dem ApplicationList-Objekt nur eine leere HashMap (siehe oben) erzeugt wird, weshalb mir bei
Code:
System.out.println(list.getItemHashMap().isEmpty());
true ausgegeben wird.

Nur wie kann ich jetzt die Umsetzung von der ArrayList in die HashMap automatisch anstoßen, sodass dann in der HashMap auch wirklich die Objekte drin sind, die ich benötige? Ruft da JAXB automatisch die setXmpApplicationList-Methode auf? Ich sehe den Wald vor lauter Bäumen nicht mehr. :rtfm:
 

kidsos

Aktives Mitglied
Das geht anscheinend wirklich nur mit Arrays. Listen werfen immer eine NullPointer-Exception.

Weißt du oder jemand anders, warum das so ist?

Danke auf jeden Fall für den entscheidenden Tipp!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
8u3631984 jaxb XML Mapper - Root Element mit Attribut XML & JSON 20
W jaxws jaxb wsdl Java-Klassen generieren und binding.xml verwenden XML & JSON 1
Rakshan Unmarshalling multiple namespaces with jaxb XML & JSON 0
B JAXB und HTML XML & JSON 1
E JAXB und java.nio.file.Path XML & JSON 4
W jaxb-api XML Feld nicht gesendet setzt das Defaultvalue nicht XML & JSON 3
S Muss ich bei JAXB immer noch eine zusaetzliche List-Wrapper Klasse erstellen wenn ich mehrere Objekte serialisieren will..? XML & JSON 1
S JAXB mit mehreren zusammenhängenden .xsd-Files XML & JSON 0
N JAXB: Überflüssiges Wrapper-Tag für Map-Einträge XML & JSON 0
D JAXB mit Map und Color XML & JSON 2
K JAXB-XML unvollständig XML & JSON 1
K JAXB Unmarshelling XML & JSON 1
E JAXB und abstrakte Klasse(n) XML & JSON 0
B JAXB - Unmarshal -> Kinder bekommen und die Kinder von den Kinder XML & JSON 7
B JAXB - Marshal ArrayList XML & JSON 2
B JAXB - java.util.Locale does not have a no-arg default constructor XML & JSON 2
B JAXB-Fehler bei REST-Api XML & JSON 0
M JAXB HashMap Dynamisches Laden XML & JSON 0
M JAXB @XMLID und @XMLIDREF, wie Daten hinzufügen XML & JSON 2
P JAXB-Problem XML & JSON 1
A JAXB: XMLMixed generieren XML & JSON 0
R [JAXB] XmlRootElement und XmlType gemeinsam nutzen XML & JSON 0
I XML to Object - Mapping mit JAXB 1.0 XML & JSON 1
L JAXB - Generischen Wert mit Liste belegen XML & JSON 1
M XML-Datei mit JAXB und 2 Namespaces XML & JSON 0
K JAXB Annotation @XMLRootElement vererben XML & JSON 0
F JAXB Unmarshal - Kein "default Constructor" XML & JSON 2
F.S.WhiTeY JAXB: Schema nicht "erben" XML & JSON 2
B JAXB - manuell Klassen aus xsd XML & JSON 3
S Jaxb Unmarshalling Problem XML & JSON 4
S JAXB - Any Elementliste - wie Werte verändern? XML & JSON 4
R JAXB: A cycle is detected in the object graph. This will cause infinitely deep XML XML & JSON 6
M JAXB versucht abstrakte Klasse zu erzeugen XML & JSON 7
M JAXB: automatisches Groß schreiben Property XML & JSON 9
C Projekt - JAXB, EMF oder doch DOM? XML & JSON 4
C JAXB: XML-Elemente einlesen und als XML-Attribute ausgeben XML & JSON 7
R sax, stax, jdom, jaxb? List von Objekten speichern und laden XML & JSON 6
J JAXB: Mehrmals abspeichern XML & JSON 3
D XML Einlesen mit JaxB XML & JSON 4
W JAXB Binding customization XML & JSON 4
L JAXB und Interfaces XML & JSON 4
S Problem with JAXB unmarshalling classes that have the same name in @XmlRootElement XML & JSON 2
eykarhorn JAXB namespace attribut aus rootelement entfernen XML & JSON 2
nrg JAXB - nor any of its super class is known to this context XML & JSON 3
S aus XML mit JAXB zu Baumstruktur XML & JSON 3
nrg JAXB generell auf XMLs übertragbar XML & JSON 22
Landei JAXB: Wert von übergeordneten Element XML & JSON 4
B PropertyChangeListener generieren mit JAXB (xjc) XML & JSON 3
G JAXB und verschachtelte Elemente? XML & JSON 6
G JAXB XML-Attribute feststellen XML & JSON 4
S JAXB 2 und JSR 303 XML & JSON 11
M [JAXB] @XmlAnyElement namespace XML & JSON 4
R JAXB Unmarshal XML & JSON 2
J JAXB und ArrayList XML & JSON 4
Landei Jpa2 -> jaxb??? XML & JSON 9
M JAXB - HashMap XML & JSON 1
dzim JAXB-Unmarshalling ignoriert/löscht Einträge aus XML - oder lässt sie verschwinden XML & JSON 3
S JAXB 2 und Java Annotationen/Interfaces generieren XML & JSON 3
ruutaiokwu jaxb eclipse plugin... XML & JSON 3
K JAXB: Klassen mit Annotation Lesen/Schreiben XML XML & JSON 3
R JAXB ausgewählte Felder XML & JSON 10
TiME-SPLiNTER JAXB: com.sun.xml.bind.v2.ContextFactory XML & JSON 3
V JAXB und leere Listen XML & JSON 2
L compareto(), equals() in JAXB generierten Dateien XML & JSON 3
D jaxb validierung/verification vor marshalling XML & JSON 3
J JAXB mit GregorianCalendar XML & JSON 4
HombreDelMundo JAXB can't handle interfaces XML & JSON 4
N Individuelles Wrapper-Element um Collection mit JAXB XML & JSON 6
B JAXB Unmarshalling mehrerer Objekte XML & JSON 2
V JAXB schema 2 java XML & JSON 3
B JPA + JAXB Mapping Problem XML & JSON 2
S Navigieren in unbekannten JAXB-Objecten XML & JSON 2
J JAXB NullPointerException im ContextFinder XML & JSON 6
H JAXB und STAX XML & JSON 2
H JAXB Probleme beim Unmarshalling XML & JSON 3
C Serialisierung mit JAXB XML & JSON 6
S JAXB und viele verschachtelte Attribute XML & JSON 1
J JAXB - Map XML & JSON 2
O JAXB generierte Klassen sollen Serializable implementieren XML & JSON 1
aze JaxB: Nullelemente in Array nicht anzeigen XML & JSON 3
turmaline JAXB can't handle interfaces XML & JSON 20
sambalmueslie JAXB - Unmarshall ein XML-Document das aus zwei XSD Definitionen besteht XML & JSON 8
S JAXB und abstrakte Klasse(n) XML & JSON 4
P JAXB: Marshalling XML & JSON 7
aze JaxB Elemente in LinkedHashSet werden nicht wiededergegeben XML & JSON 3
M JAXB: Wie folgendes Konstrukt abbilden? XML & JSON 20
A Jaxb und Interfaces XML & JSON 12
B JaxB und XSD :-) XML & JSON 8
G JAXB - Marshaller - kein Rückgabewert XML & JSON 2
N XML will nicht weder JAXB noch XStream XML & JSON 8
F Zugriff auf durch JAXB erzeugte Object-Struktur... XML & JSON 6
C Java-Imports bei Jaxb XML & JSON 8
F Marshaling eines JAXB Objektes worin ein anderes JAXB Objekt eingeschlossen ist XML & JSON 6
K JAXB, Vererbung und Codegeneration XML & JSON 2
M XmlRootElement und JAXB XML & JSON 4
R JAXB: Aus einem Vector oder List XML Datei erstellen XML & JSON 1
G jaxb Vector (oder ähnliches) von Elementen generieren XML & JSON 6
M Jaxb Annotationen, Wert als XML Element XML & JSON 2
J JCheckbox abfragen und serialisieren mit JAXB 2.0 XML & JSON 15
F JAXB erste schritte XML & JSON 6

Ähnliche Java Themen

Neue Themen


Oben