Java Objekte in XML mit JAXB

mannni10

Mitglied
Guten Tag,

ich habe ein prgramm geschrieben in dem man Benutzer, Programme und keys anlegen kann.
Diese kann man dann einander zuweißen und kann dann schauen welcher Benutzer welche Programme und welche Keys benutzt.
Das läuft auch einwandfrei, nur das Speichern der Objekte in XML Dateien nicht.
Ich möchte das mithilfe von JBAX machen, nur habe ich keine Ahnung wie ich das anstellen soll.
Gegoogelt habe ich auch schon, nur gibt es keine verständliche erklärung dafür.

Was ich bis jetzt gefunden habe:

Eine Klasse wird als @XmlRootElement definiert.
Die Attribute des Objecktes werden als @XmlElement definiert.
Danach schreibt man mit:

Java:
JAXBContext context = JAXBContext.newInstance( Benutzer.class ); 
Marshaller m = context.createMarshaller(); 
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE ); 
m.marshal( club, System.out );
Writer w = null; 
w = new FileWriter( "C:\\Dokumente und Einstellungen\\Benutzer\\Desktop\\jaxb.xml" ); 
m.marshal( user, w );

den code in die xml Datei.
Bei mir kommt da immer eine Fehlermeldung:

Java:
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Administration.Application does not have a no-arg default constructor.
	this problem is related to the following location:
		at Administration.Application

	at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(Unknown Source)
	at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source)
	at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
	at javax.xml.bind.ContextFinder.find(Unknown Source)
	at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
	at javax.xml.bind.JAXBContext.newInstance(Unknown Source)

Mein Problem ist jetzt:
1. Welche klasse muss ich als @XmlRootElement definieren?
2. Was ist @XmlElement
3. Warum funktioniert das mit dem Schreiben in die Datei nicht, was muss ich da machen?

Kann mir das jemand erklären? Wäre sehr Dankbar.
Wenn es eine Alternative für JAXB gibt, dann bin ich offen für neues.

Gruß, Manni
 
Was ist [c]Administration.Application[/c] für eine Klasse und warum hat sie keinen Defaultkonstruktor, welchen sie gemäss Fehlermeldung besitzen müsste?
 
Deine Daten-Klasse ist zu annotieren, bspw. so:
Java:
@XmlRootElement
public class Benutzer {
    private String name;
    // ... weitere Felder genauso

    @XmlElement(name="Name")
    public String getName() {return name;}
    public void setName(String n) {name=n;}

    // ... weitere getter und setter genauso
}

/edit: Code aufgehübscht.
 
@faetzminator:
Ich habe das so gemanaged:
Ich hab eine User Klasse und eine User Manager Klasse. Genau das gleich für Application und Keys.
In den Managern speichere ich die Objekte der jeweiligen Klassen in Listen.
Ich will jedoch alle Objekte von User, Application und Key in einer Xml Datei Speichern. Bei der Fehlermeldung habe ich es gerade bei Application versucht. Den Konstruktor von der Klasse habe ich selbst geschrieben:

Java:
Application (String hersteller, String titel, String version, String sonstiges, String notizen, int applicationID){
	this.hersteller = hersteller;
	this.titel = titel;
	this.version = version;
	this.applicationID = applicationID;
}

Genauso bei User und Key.

@ SamHotte:
Okay, hab ich gemacht.
Wie gehts jetzt weiter?
Muss ich jetzt einfach nachdem ich das Objeckt erstellt habe folgendes tun?
PHP:
JAXBContext context = JAXBContext.newInstance( Benutzer.class ); 
Marshaller m = context.createMarshaller(); 
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE ); 
m.marshal( user, System.out );

Wenn ich das mache, dann muss ich bei jeder Methode "throws JAXBException, IOException" dazuschreiben. Genauso wie bei jeder übergeordneten Methode. Was heißt das?
Und dann kommt der Fehler. Also wie soll ichs machen? Gruß
 
Du brauchst einfach einen Konstruktor wie diesen für JAXB (kannst aber auch andere für deinen eigenen Gebrauch haben) :

Java:
public Application (){}
 
Alles klar, jetzt funktionierts. Ich wusste garnicht das man auch zwei oder mehrere Konstruktoren haben kann. Vielen Dank an alle und schöne Woche noch 🙂
Gruß Mannni
 
Eine Frage habe ich noch.
Ich schreibe das Objeckt immer in das File nachdem ich es erstellt habe.
In dem File ist jedoch immer nur eine Zeile.
Wie kann ich die Objeckte zum File hinzufügen, nicht überschreiben?
Hier mein code:

Java:
JAXBContext context = JAXBContext.newInstance( User.class ); 
	Marshaller m = context.createMarshaller(); 
	m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE ); 
	m.marshal( user, System.out );
	Writer w = null; 			
	w = new FileWriter( "Users.xml" ); 
	m.marshal( user, w );
 
Wie wärs, wenn du eine (JAXB-)Klasse [c]Users[/c] erstellst, welche eine [c]List<User>[/c] (oder wars in JAXB PredicateList o.ä.?) beinhaltet?
 

Neue Themen


Zurück
Oben