JAXB und Java Maps/LIsts

Tom_O

Grünschnabel
Hi,

ich komm' irgendwie mit der Behandlung von Java Maps mittels JAXB (2.0 <- Java 6) nicht klar. Ich möchte Einträge einer Map
Code:
Map<String, Foo> fooMap= new HashMap<String, Foo>;
folgender Maßen ausgeben:
Code:
<Foo>...</Foo>
...
<Foo>...</Foo>
<Foo>...</Foo>
also so als würde ich ein Array oder eine Liste umwandeln. Ich dachte mir, ich schreib' einen eigenen XMLAdapter der die Werte der Map zurückgibt:
Code:
  public T1[] marshal(Map<String, Foo> m) throws Exception {
    return m.values().toArray(new Foo[0]);
  }
Funktioniert aber nicht, da die Einträge "gewrappt" werden:
Code:
<fooMap>
   <item>...</item>
   ...
   <item>...</item>
   <item>...</item>
</fooMap>
Gibt es eine Annotation die quasi das Gegenteil von @XmlElementWrapper bewirkt? :rolleyes:

Im wesentlichen habe ich mich an das Beispiel von Kohsuke Kawaguchi in seinem Blog gehalten: http://weblogs.java.net/blog/kohsuke/archive/2005/04/xmladapter_in_j.html

Resultat:
Code:
<brochure>
   <course>
      <item id="id">
         <name>name</name>
      </item>
       ...
      <item id="id">
         <name>name</name>
      </item>
   </course>
</brochure>
statt:
Code:
<brochure>
   <course id="id">
      <name>name</name>
   </course>
    ....
   <course id="id">
      <name>name</name>
   </course>
</brochure>

Danke schon mal und lG,
Tom.
 
Ich grab mal die etwas alten Thread wieder aus, da ich zur Zeit in der selben Misere sitze. Ich bin nach dem selben Beispiel, wie im obigem Link, vorgegangen, allerdings bekomme ich jedes Mal folgende Exception:
Code:
org.xml.sax.SAXParseException: cvc-complex-type.4: Attribute 'id' must appear on element 'company'.

Meine Klassen sehen folgendermaßen aus (vereinfacht dargestellt):
Code:
@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;
	}
}
Code:
@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;
	}
}
Der Vollständigkeit halber noch die CompanyListAdapter-Klasse:
Code:
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 sehe da im Vergleich zu dem Beispiel absolut keinen Unterschied. Könnt ihr mir bitte helfen?
 
Hat sich mittlerweile erledigt. Ich hatte beim Marshalling noch gegen ein Schema validiert, dass allerdings noch auf einem früheren Datenmodell basierte. Das hab ich nun rausgenommen. Der Exception wird also nicht mehr geworfen.

Jetzt wird die XML-Datei aber nicht mehr so befüllt, wie ich es mir vorgestellt habe.

Statt:
Code:
<jobApplications>
    <company id="0">
    </company>
    usw.
</jobApplications>
wird nun folgendes in die XML-Datei gespeichert:
Code:
<jobApplications>
    <company/>
</jobApplications>
Wo kann denn da jetzt der Fehler liegen?
 
Zurück