[pesadamente editado a medida que avanza la comprensión]Definir espacios de nombres primavera JAXB sin utilizar NamespacePrefixMapper
¿Es posible obtener primavera Jaxb2Marshaller utilizar un conjunto personalizado de los prefijos de espacio de nombres (o al menos respetar las dadas en el archivo de esquema/anotaciones) sin tener que usar una extensión de un NamespacePrefixMapper?
La idea es tener una clase con una relación "tiene una" con otra clase que a su vez contiene una propiedad con un espacio de nombres diferente. Para ilustrar mejor esto, considere el siguiente esquema de proyecto que usa JDK1.6.0_12 (el último que puedo tener en mis manos en el trabajo). Tengo el siguiente en el paquete 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;
Correr Main.main() da el siguiente resultado:
<?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>
mientras que lo que me gustaría es:
<?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 vez que esta parte está funcionando, entonces el problema pasa a la configuración de la Jaxb2Marshaller en Spring (Spring 2.5.6, con spring-oxm-tiger-1.5.6 que proporciona Jaxb2Marshaller) para que proporcione el mismo a través de una configuración de contexto simple y una llamada a mariscal().
¡Gracias por su continuo interés en este problema!
¿Se puede hacer funcionar esto con un 'JAXBContext' vainilla, es decir, sin Spring involucrado? Parece que 'Jaxb2Marshaller' no debería ser relevante para el problema. Además, ¿qué versiones de JDK y/o JAXB estás usando? (p.s. hola Gary :) – skaffman
Oye, skaffman :-) hizo los cambios necesarios. Esto está haciendo mi tuerca. –