efinieren Sie Spring JAXB-Namespaces ohne NamespacePrefixMappe

[Mit zunehmendem Verständnis stark bearbeitet]

Ist es möglich, Spring Jaxb2Marshaller zu veranlassen, einen benutzerdefinierten Satz von Namespace-Präfixen zu verwenden (oder zumindest die in der Schemadatei / den Anmerkungen angegebenen zu beachten), ohne eine Erweiterung eines NamespacePrefixMapper verwenden zu müssen?

Die Idee ist, eine Klasse mit einer "has a" -Beziehung zu einer anderen Klasse zu haben, die wiederum eine Eigenschaft mit einem anderen Namespace enthält. Um dies besser zu veranschaulichen, betrachten Sie die folgende Projektskizze, die JDK1.6.0_12 verwendet (die neueste, die ich bei der Arbeit anwenden kann). Ich habe das folgende im Paket org.example.domain:

Main.java:

package org.example.domain;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class Main {
  public static void main(String[] args) throws JAXBException {
    JAXBContext jc = JAXBContext.newInstance(RootElement.class);

    RootElement re = new RootElement();
    re.childElementWithXlink = new ChildElementWithXlink();

    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(re, System.out);
  }

}

RootElement.java:

package org.example.domain;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(namespace = "www.example.org/abc", name="Root_Element")
public class RootElement {
  @XmlElement(namespace = "www.example.org/abc")
  public ChildElementWithXlink childElementWithXlink;

}

ChildElementWithXLink.java:

package org.example.domain;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;

@XmlRootElement(namespace="www.example.org/abc", name="Child_Element_With_XLink")
public class ChildElementWithXlink {
  @XmlAttribute(namespace = "http://www.w3.org/1999/xlink")
  @XmlSchemaType(namespace = "http://www.w3.org/1999/xlink", name = "anyURI")
  private String href="http://www.example.org";

}

package-info.java:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://www.example.org/abc",
    xmlns = {
          @javax.xml.bind.annotation.XmlNs(prefix = "abc", namespaceURI ="http://www.example.org/abc"),
          @javax.xml.bind.annotation.XmlNs(prefix = "xlink", namespaceURI = "http://www.w3.org/1999/xlink")
            }, 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
    package org.example.domain;

Running Main.main () gibt die folgende Ausgabe aus:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:Root_Element xmlns:ns1="http://www.w3.org/1999/xlink" xmlns:ns2="www.example.org/abc">
<ns2:childElementWithXlink ns1:href="http://www.example.org"/>
</ns2:Root_Element>

whereas was ich möchte ist:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<abc:Root_Element xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:abc="www.example.org/abc">
<abc:childElementWithXlink xlink:href="http://www.example.org"/>
</abc:Root_Element>

Wenn dieser Teil funktioniert, wird das Problem mit der Konfiguration des Jaxb2Marshaller im Frühjahr fortgesetzt (Spring 2.5.6, wobei Spring-Oxm-Tiger-1.5.6 Jaxb2Marshaller bereitstellt), sodass er dasselbe über eine einfache Kontextkonfiguration bereitstellt und ein Aufruf an marshal ().

Vielen Dank für Ihr anhaltendes Interesse an diesem Problem!

Antworten auf die Frage(8)

Ihre Antwort auf die Frage