3 Stimmen

Dynamisches Festlegen des Namensraums von Objekten beim Jaxb-Marshalling

Ich habe eine Situation, wo ich meine Namespaces dynamisch für meine Jaxb-Klassen einrichten müssen. meine Namespace in Jaxb-Klassen haben eine Version, die dynamisch geändert werden muss.

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

 }

mein Marshalling funktioniert perfekt, wenn ich diesen statischen Namespacing-Mechanismus verwende, aber in meiner realen Situation muss diese Version dynamisch geändert werden.

Ich habe diesen Ansatz ausprobiert, um dieses Problem beim Rangieren zu lösen

 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 hat mir einen Fehler angezeigt Ungültiger Zustand: Start-Tag ist bei writeNamespace nicht geöffnet

Wir sind für jeden Beitrag zur Lösung dieses Problems dankbar.

2voto

chris Punkte 3533

Sie können eine XMLStreamWriter die alle Aufrufe an den ursprünglichen Autor delegiert, aber die writeNamespace(...) Methode:

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);
}

1voto

Patrice M. Punkte 3854

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X