JAXB - Problem mit Java Listen unmarshalling

Verständnisproblem:

Code:
public void setMovieFormats(List<MovieFormat> movieFormats) {
   
    	this.movieFormats = movieFormats;   
    }

gemäß obiger Methode übergebe ich ein Listobjekt welches Objekte enthält vom Typ MovieFormat. Soweit OK. Nun frage ich mich aber, wie lese ich einzelne Strings die sich nun eben in einer JComboBox befinden in das objekt MovieFormat ? Und warum benötige ich eine eigene Klasse MovieFormat wenn ich nur beliebe strings einlesen will in eine Liste?
 
Ein String ist eben nur ein String und wenn der im Sourcecode auftaucht weiß man nicht so genau was er beeinhaltet. Da ist es doch schöner wenn man von einem Objekt MovieFormat liest.

Du kannst ja noch einen Konsruktor zu der Klasse hinzufügen:
Java:
public class MovieFormat {

private MovieFormat(){}//Wird von JAXB benötigt

public MovieFormat(String name) {
this.name = name;
}

}

Dann kannst du dir mit new MovieFormat(String) ein Objekt erstellen und alles ist gut ;)
 
Ein String ist eben nur ein String und wenn der im Sourcecode auftaucht weiß man nicht so genau was er beeinhaltet. Da ist es doch schöner wenn man von einem Objekt MovieFormat liest.

Du kannst ja noch einen Konsruktor zu der Klasse hinzufügen:
Java:
public class MovieFormat {

private MovieFormat(){}//Wird von JAXB benötigt

public MovieFormat(String name) {
this.name = name;
}

}

Dann kannst du dir mit new MovieFormat(String) ein Objekt erstellen und alles ist gut ;)

danke zeja dass du mir immer antwortest, ich weiß das echt zu schätzen, dennoch denke ich reden wir bissl einander vorbei ;)

Schau mal:

Ich habe eine GUI da kann der Benutzer meines Programmes selbst die filmformate hinzufügen die er auf seiner Festplatte hast. Das hinzufügen geschieht über eine editierbare jcombobox per "+" oder "-"-button sprich er kann formate der liste hinzufügen/aus liste löschen. Nun sind das einfache Strings und keine Objekte, denn diese formate wie avi,mov,wmv,mpeg usw. haben und werden keine weiteren eigenschaften haben (ein Objekt hingegen hat eigenschaften für mich). Was Ihr mir vorschlagt soweit ich JAXB bisher verstand sind eher Komplexe Typen, doch mir reicht völlig in dieser Situtation ein Simple Typ. Ich werde heute abend wenn mir die Zeit reicht nochmals ein einfaches public List<String> movieformatnames; Beispiel posten und was genau ich daran nicht verstehe ;)

Was mir bisher anhand meines jaxb 2.0 buches nicht klar wurde ist, WIE erstelle ich diese XML-Schemata ? und für was überhaupt denn bisher gings auch so...
 
Ich denke XML Schemata werden nicht unbedingt in einem JAXB Buch behandelt. Such mal danach. Mit einem Schema kannst du unter anderem sicherstellen dass deine XML Datei wohlgeformt ist, also einem bestimmten Aufbau entspricht. Das Schema kann man bei JAXB zur Validierung mit angeben.

Mein Beispiel war übrigens mit Strings. Mußt du wissen wie dus benutzen willst.
 
Ich seh den Fokus eigentlich ein wenig anders bei JAXB. XSD ist eigentlich der Kern von JAXB. XSD ist eine (Programmiersprachen-)unabhängige Beschreibungssprache für XML. Wie Zeja schon geschrieben hat legst du damit den Aufbau und Restriktionen für ein XML Dokument fest. JAXB erlaubt dir nun die Verarbeitung von XML Dateien für ein XSD. Das heißt sämtliche Strukturierungsinformationen für die Javaklassen die du benötigst werden im Generierungsschritt aus dem XSD gezogen. Danach brauchst du es nicht mehr.

Das sorgt dafür, dass du bei einer Änderung am XSD einfach die Klassen neu generieren kannst und halt die Clients entsprechen anpassen musst. JAXB kommt eigentlich aus der WebServices Ecke. Dort werden halt SChnittstellen sprachenneutral beschrieben.

Lange Rede, kurzer Sinn: du solltest für dein XML ein XSD definieren und dir dann die Klassen vom XJC generieren lassen. Dann versuchst du das XML per JAXB zu mappen und wenn Probleme auftauchen, passt du das XSD bzw. XML nach und nach an.

Gruß
Ollie
 
Hmm das sehe ich ein wenig anders. So war es früher vielleicht mal uns so mag es auch sinnvoll sein wenn man für das XML eine bestimmte Struktur haben möchte. Wenn man jedoch JAXB nur für XML-Persistenz verwendet und einem der Aufbau eigentlich egal ist, warum sollte man sich dann die Mühe machen und ne XSD schreiben, wo Java-Klassen schreiben und annotieren so viel einfacher ist.

Also jetzt jemanden dazu zwingen wollen ne XSD zu schreiben ist nun wirklich überflüssig. JAXB unterstützt beide Vorgehensweisen und das ist auch gut so.
 
Hmm das sehe ich ein wenig anders. So war es früher vielleicht mal uns so mag es auch sinnvoll sein wenn man für das XML eine bestimmte Struktur haben möchte. Wenn man jedoch JAXB nur für XML-Persistenz verwendet und einem der Aufbau eigentlich egal ist, warum sollte man sich dann die Mühe machen und ne XSD schreiben, wo Java-Klassen schreiben und annotieren so viel einfacher ist.

Also jetzt jemanden dazu zwingen wollen ne XSD zu schreiben ist nun wirklich überflüssig. JAXB unterstützt beide Vorgehensweisen und das ist auch gut so.

danke zeja dass du das geschrieben hast hehe denn mit Olivers Aussage musst ich dann doch ganz schön schlucken :suspekt:

und ja stimmt zeja du hast wirklich das ganze mit String mir gezeigt...habs völlig verpeilt wegen dem riesigen Beispiel von Thomas hehe. Ich melde mich nochmals in den Pfingstferien habe ne volle Woche :)
 
Hm... ich seh das so. XML ohne XSD oder DTD ist wie ein Sprache ohne Grammatik. Wie oft habe ich mir schon bei diversen Tools nen Wolf gesucht, weil die irgendwelche XML Konfigurationsfiles benötigen und nirgendwo spezifiziert ist, wie Elemente geschachtelt werden dürfen, was für Attribute notwendig sind usw. XML von Hand editieren ohne Toolunterstützung ist nicht nur fehleranfällig sondern auch unheimlich mühsam. Da bist du dann in null Komma nichts wieder bei trial / error Konfiguration / Programmierung.

Eure letzte zwei Posts klingen auch etwas, als wäre XSD der Vorort der Hölle. Das XSD zu eurem Beispiel XML oben hat vielleicht 20 Zeilen. Selbst wenn man von XSD kaum Ahnung hat, zahlt sich die Zeit die man da reinsteck doppelt und dreifach aus. Gerade wenn du das XML verarbeiten willst. Ohne XSD kannst du das XMl nicht wirklich validieren und es fliegen recht schnell irgendwelche Exceptions, wenn ein Element nicht gefunden wird o.ä. Btw. glaub ich auch nicht, dass es mehr Zeit kostet sich in die Annotationen einzuarbeiten, als in XSD

XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/NewXMLSchema" xmlns:tns="http://www.example.org/NewXMLSchema" elementFormDefault="qualified">

	<!-- Rootelelement -->
	<xsd:element name="settingsData">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="company" type="xsd:string" />
				<xsd:element name="playtime" type="xsd:int" />
				<xsd:element name="movieFormats" type="tns:movieFormats" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	
	<!-- Movie Formats list -->
	<xsd:complexType name="movieFormats">
		<xsd:sequence>
			<xsd:element name="movieFormat" type="tns:movieFormat" />
		</xsd:sequence>
	</xsd:complexType>
	
	<!-- Single movie format -->
	<xsd:simpleType name="movieFormat">
		<xsd:restriction base="xsd:string">
			<xsd:enumeration value="AVI" />
			<xsd:enumeration value="MPG" />
			<xsd:enumeration value="MPEG" />
		</xsd:restriction>
	</xsd:simpleType>

</xsd:schema>

REINHAUN!
 
Zuletzt bearbeitet von einem Moderator:
Lange Rede, kurzer Sinn: du solltest für dein XML ein XSD definieren und dir dann die Klassen vom XJC generieren lassen. Dann versuchst du das XML per JAXB zu mappen und wenn Probleme auftauchen, passt du das XSD bzw. XML nach und nach an.

so mal wieder etwas zeit für java ^^ :

ganz stupide: ich geh in mein notepad, schreib das schema rein wie du siehe unten, wo ist da aber die echtzeicht Syntax-Prüfung? Gibts das in Java nicht? Gibts kein vernüftiges Tool, welches mir die .xsd erstellt indem ich z.B. über ein Formular die elemente angeben, ob es simple/complex sind, enumerationen/listen etc


1.
<?xml version="1.0" encoding="UTF-8"?>
2.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/NewXMLSchema" xmlns:tns="http://www.example.org/NewXMLSchema" elementFormDefault="qualified">
3.

4.
<!-- Rootelelement -->
5.
<xsd:element name="settingsData">
6.
<xsd:complexType>
7.
<xsd:sequence>
8.
<xsd:element name="company" type="xsd:string" />
9.
<xsd:element name="playtime" type="xsd:int" />
10.
<xsd:element name="movieFormats" type="tns:movieFormats" />
11.
</xsd:sequence>
12.
</xsd:complexType>
13.
</xsd:element>
14.

15.
<!-- Movie Formats list -->
16.
<xsd:complexType name="movieFormats">
17.
<xsd:sequence>
18.
<xsd:element name="movieFormat" type="tns:movieFormat" />
19.
</xsd:sequence>
20.
</xsd:complexType>
21.

22.
<!-- Single movie format -->
23.
<xsd:simpleType name="movieFormat">
24.
<xsd:restriction base="xsd:string">
25.
<xsd:enumeration value="AVI" />
26.
<xsd:enumeration value="MPG" />
27.
<xsd:enumeration value="MPEG" />
28.
</xsd:restriction>
29.
</xsd:simpleType>
30.

31.
</xsd:schema>
 
Was hat das mit Java zu tun?

Vorschlag: Installier dir Eclipse, leg das XSD File in irgendein Projekt. Dann gehts nach "Einstellungen -> XML Catalog -> Add...". Dort fügst du das File dem Catalog hinzu und machst die entsprechenden Einstellungen.

Wenn du nun ein XML File anlegst und dort auf die Schema URI verweist erkennt das Eclipse und validiert das Dokument inplace.

Gruß
Ollie
 
Zurück