2012-03-24 9 views
3

Ich habe eine Situation, in der ich meine Namespaces dynamisch für meine Jaxb-Klassen einrichten muss. Mein Namespace in Jaxb-Klassen hat eine Version, die dynamisch geändert werden muss.Namespace von Objekten dynamisch in jaxb Marshalling setzen

@XmlRootElement(name = "myobject",namespace="http://myhost.com/version-2") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType 
public class myObject{ 

} 

meine Rangierung perfekt funktioniert, wenn ich diesen statischen Namespacing Mechanismus verwenden, aber in meiner realen Situation, ich brauche diese Version dynamisch geändert werden ..

habe ich versucht, diesen Ansatz, um dieses Problem zu lösen, wenn

Rangier
XMLStreamWriter xmlStreamWriter =  
XMLOutputFactory.newInstance().createXMLStreamWriter(stringWriter); 
String uri = "http://myhost.com/ver-"+version; 

//xmlStreamWriter.setDefaultNamespace(uri); 
xmlStreamWriter.writeStartDocument("1.0"); 

xmlStreamWriter.writeNamespace("ns1", uri); 

mein Versuch setDefaultNamespace zu verwenden war nicht erfolgreich und writeNamespace mir einen ungültigen Status Fehler werfen: tag beginnen bei writeNamespace nicht geöffnet

Jede Eingabe, wie dies gelöst werden kann, wird sehr geschätzt.

+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/277502/jaxb-how- to-ignore-namespace-when-unmarshalling-xml-document Es gibt einige Beispiele dafür, wie Payload im laufenden Betrieb manipuliert werden kann. – Osw

Antwort

2

Sie implementieren kann ein XMLStreamWriter die Delegierten alle Anrufe an den ursprünglichen Autor, aber die writeNamespace(...) Methode überschreibt:

public void writeNamespace(String prefix, String uri) { 
    if ("http://myhost.com/version-2".equals(uri) { 
    uri = "http://myhost.com/version-" + version; 
    } 
    delegate.writeNamespace(prefix, uri); 
} 
+0

wenn ich versuche, dies zu überschreiben .. xmlStreamWriter.writeNamespace ("ns2", http://myhost.com /version-2); ich diesen Fehler .. ungültiger Zustand: Start ist Tag nicht bei writeNamespace (ns2, http://myhost.com/version-2) geöffnet – Sanath

+0

Bitte versuchen Sie das Startelement (String uri außer Kraft zu setzen, ...) und setPrefix (...) Metoden auf die gleiche Weise. Grundsätzlich muss jede Methode, die einen NamespaceURI-Parameter erhält, die Namespace-Umwandlung durchführen. – chris

+0

Da ich nur die Namespace-Version nur im Root-Element der XML-Datei hinzufügen wollte, habe ich diesen Trick gemacht. Ich hatte die annotierte XML-Modellklasse wie dieses @ XmlRootElement (name = "myobject", namespace = "myhost.com/version- ") @XmlAccessorType (XmlAccessType.FIELD) @XmlType öffentliche Klasse myObject {} – Sanath

1

Haben Sie eine XSL-T-Transformation in Betracht gezogen? Abhängig von Ihrem Schema könnte es relativ einfach sein, den Namespace nach dem Marshalling zu ersetzen.

+0

Wie wäre es mit der Leistung dieses .. Ich glaube, dass die Leistung des Lesens des Doms nach dem Marshalling wird sich auf die Leistung auswirken. Warum kann ich beim Erstellen des XML-Stream-Writer nicht den Standard-Namespace oder ähnliches verwenden? – Sanath

+1

Ich denke, ich erinnere mich, dass es Streaming-XSL-Prozessoren gibt. Sie haben eine eingeschränkte Funktionalität, aber für so einfache Aufgaben sollte es in Ordnung sein. – Jarekczek

Verwandte Themen