[fortemente modificato la comprensione progredisce]Definire namespace Primavera JAXB senza utilizzare NamespacePrefixMapper
E 'possibile ottenere primavera Jaxb2Marshaller per utilizzare un set personalizzato di prefissi di namespace (o almeno rispettare quelli dati nel file di schema/annotazioni) senza dover utilizzare un'estensione di NamespacePrefixMapper?
L'idea è di avere una classe con una relazione "ha una" con un'altra classe che a sua volta contiene una proprietà con un diverso spazio dei nomi. Per meglio illustrare questo consideriamo il seguente schema di progetto che usa JDK1.6.0_12 (l'ultimo che posso mettere in campo al lavoro). Ho il seguente nel pacchetto 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;
esecuzione Main.main() ha pronunciato la seguente uscita:
<?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>
mentre ciò che vorrei è:
<?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>
Una volta che questa parte funziona, allora il problema passa alla configurazione del Jaxb2Marshaller in Spring (Spring 2.5.6, con spring-oxm-tiger-1.5.6 che fornisce Jaxb2Marshaller) in modo che fornisca lo stesso tramite una semplice configurazione del contesto e una chiamata a marshal().
Grazie per il vostro continuo interesse in questo problema!
Riesci a farlo funzionare con un vanilla 'JAXBContext', vale a dire nessuna primavera coinvolta? Sembra che 'Jaxb2Marshaller' non dovrebbe essere rilevante per il problema. Inoltre, quali versioni JDK e/o JAXB stai usando? (p.s. hi Gary :) – skaffman
Ehi, skaffman :-) ha apportato le modifiche necessarie. Questo sta facendo il mio dado. –