2010-12-29 7 views
1

Der Standardansatz für die Deserialisierung von JAXB XML scheint darin zu bestehen, den Paketnamen beim Erstellen des Kontexts anzugeben. Dann sieht JAXB die Klasse bis basierend auf dem Wurzelelement:Kann JAXB den Klassennamen im XML speichern, so dass der Deserialisierungscode keine Kenntnis der Klasse benötigt?

JAXBContext jc = JAXBContext.newInstance("com.foo"); 
Unmarshaller u = jc.createUnmarshaller(); 
Object o = u.unmarshal(new StringReader("<?xml version="1.0" encoding="UTF-8"  standalone="yes"?><MyJaxb>...")); 

Ich bin für einen flexibleren Ansatz, wo ich muß nicht die Paketnamen angeben und noch jedes Objekt deserialisieren kann. Dies wäre so einfach, wie JAXB das Paket im XML speichert, aber ich kann nicht herausfinden, wie das geht. Ich kann den Code selbst schreiben, aber das wäre unangenehm. Es würde gerne JAXB tun, wenn möglich. Übrigens verwende ich keine Schemas, nur Annotationen und Marshal/Unmarshal. Irgendwelche Ideen?

Antwort

1

Eigentlich können Sie kein Objekt mit reinem JAXB deserialisieren. Sie müssen entweder Pakete angeben (wobei ObjectFactory.class gesucht wird) oder eine Liste von Klassen wie JAXBContext.newInstance(Class1.class, Class2.class, Class3.class);. So funktioniert jaxb, es ist ein Teil der Vereinbarung. Wenn Ihre Aufgaben größer sind, z. Java-Klassen aus beliebiger XML-Struktur aufbauen - das ist auch möglich, aber man muss etwas konkreter sein - was meinst du unter "flexiblerer Ansatz".

+0

Ich möchte die Möglichkeit haben, jedes Objekt in meinem Klassenpfad zu deserialisieren, z. B .: Objekt o = u.unmarshal (...); ohne jedes mögliche Paket angeben zu müssen und die Liste kontinuierlich zu aktualisieren, wenn ich Klassen mit neuen Paketen hinzufüge. Sie müssen lediglich den Paketnamen im XML-Code speichern. Ich denke, GSON macht das. – Andrew

+0

@Andrew. Deserialisieren und was tun? Das war die Frage. Sie können mit Object in Java nicht viel anfangen, aber die Übergabe an JS kann wesentlich mehr. – Osw

+0

Es gibt viele Dinge, die Sie mit Object (z. B. Reflektion) tun können, und das ist es, was ich brauche. Sieht so aus, als würde meine Lösung den Paketnamen zum XML hinzufügen. – Andrew

1

Sie sollten in der Lage sein, mehr als ein Paket hinzuzufügen, wenn Sie die Instanz des jaxbcontext-Objekts abrufen. Sie können so viele Pakete hinzufügen, wie Sie möchten.

Ich bin mir jedoch nicht sicher, wie Sie es verwenden werden, wenn Sie es in eine Objektinstanz deserialisieren? Verwenden Sie nicht das, was Sie gerade deserialisiert haben?

Auch Unmarshaller ist keine threadsichere Klasse, wenn Ihre Anwendung eine Multithread-Anwendung ist.

+0

Ich erhalte die Objekte über jax-rs, dann weiter zu Diensten, die damit umgehen können. Gut zu wissen, dass ich mehrere Pakete liefern kann, aber ich denke, das könnte ein Wartungsproblem sein. – Andrew

+0

Wenn Sie nur die Paketnamen in eine Eigenschaft oder Konfigurationsdatei platzieren möchten. Sie können das obige erneut verwenden und jedes Paket definieren, das Sie in dieser Konfigurationsdatei benötigen, so dass Sie nicht jedes Mal kompilieren müssen, wenn Sie neue Pakete hinzufügen müssen. willst du das machen? – fmucar

+0

Ich könnte das tun, aber jedes Mal, wenn ich eine neue Klasse hinzufüge, muss ich diese Datei aktualisieren. Ein Build-Skript, das es automatisch aktualisiert, würde das lösen, aber nicht müssen. Es scheint so einfach und offensichtlich, dass ich mir nicht vorstellen kann, dass JAXB keine bessere Lösung hat. – Andrew

Verwandte Themen