[bearbeiten Stark wie Verständnis voranschreitet]definiert Frühling JAXB Namespaces ohne NamespacePrefixMapper mit
Ist es möglich, Frühling Jaxb2Marshaller zu verwenden, um einen benutzerdefinierten Satz von Namespacepräfixe (oder zumindest zu respektieren diejenigen in der Schemadatei/Anmerkungen gegeben zu erhalten) ohne eine Erweiterung eines NamespacePrefixMapper verwenden zu müssen?
Die Idee ist, eine Klasse zu haben, mit einem „hat eine“ Beziehung zu einer anderen Klasse, 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 (das letzte, was ich bei der Arbeit in die Finger bekomme). Ich habe nach dem 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;
Lauf Main.main() gibt die folgende Ausgabe:
<?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>
während das, was würde Ich mag 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>
Sobald dieser Teil funktioniert, dann ist das Problem der Konfiguration auf die bewegt Jaxb2Marshaller im Frühjahr (Frühjahr 2.5.6, mit Spring-Oxm-Tiger-1.5.6 bietet Jaxb2Marshaller), so dass es das gleiche durch eine einfache Kontextkonfiguration und einen Aufruf von marshal() bereitstellt.
Vielen Dank für Ihr Interesse an diesem Problem!
Können Sie dies mit einem Vanilla 'JAXBContext' arbeiten, d. H. Kein Spring beteiligt? Es sieht so aus, als ob 'Jaxb2Marshaller' für das Problem nicht relevant sein sollte. Welche JDK- und/oder JAXB-Versionen verwenden Sie? (p.s. hallo Gary :) – skaffman
Hey, Skaffman :-) machte die Änderungen nach Bedarf. Das macht meine Nuss. –