JAXB: Necesita el prefijo del espacio de nombres para todos los elementos

Estoy usando Spring WebServiceTemplate para hacer una llamada al servicio web que utiliza JAXB para generar XML de solicitud. Mi requisito necesita todos los elementos (incluida la raíz) para tener un prefijo de espacio de nombres (solo hay un único espacio de nombres) en la solicitud SOAP.

Ej .:

 abc abc  

Pero estoy recibiendo

  abc abc  

xsd:

         

Generado clase de Java de XSD

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Login", propOrder = { "username", "password" }) @XmlRootElement public class Login { @XmlElement(required = true) protected String username; @XmlElement(required = true) protected String password; ...... } 

package-info.java

 @javax.xml.bind.annotation.XmlSchema( namespace = "www.example.com/a", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package authenticator.beans.login; 

Desea saber cómo generar el XML de solicitud con el prefijo de espacio de nombre para todos los elementos, incluido el directorio raíz.

Resuelto agregando

 @XmlSchema( namespace = "http://www.example.com/a", elementFormDefault = XmlNsForm.QUALIFIED, xmlns = { @XmlNs(prefix="ns1", namespaceURI="http://www.example.com/a") } ) package authenticator.beans.login; import javax.xml.bind.annotation.*; 

en package-info.java

Tomó la ayuda de jaxb-namespaces-missing : Answer provided by Blaise Doughan

MSK,

¿Has intentado establecer una statement de espacio de nombres para tus variables miembro de esta manera? :

 @XmlElement(required = true, namespace = "http://example.com/a") protected String username; @XmlElement(required = true, namespace = "http://example.com/a") protected String password; 

Para nuestro proyecto, resolvió problemas de espacio de nombres. También tuvimos que crear NameSpacePrefixMappers.

Otra forma es decirle al marshaller que use siempre un cierto prefijo

 marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() { @Override public String getPreferredPrefix(String arg0, String arg1, boolean arg2) { return "ns1"; } });' 

Estaba enfrentando este problema, solucionado al agregar paquete-información en mi paquete

y el siguiente código en él:

 @XmlSchema( namespace = "http://www.w3schools.com/xml/", elementFormDefault = XmlNsForm.QUALIFIED, xmlns = { @XmlNs(prefix="", namespaceURI="http://www.w3schools.com/xml/") } ) package com.gateway.ws.outbound.bean; import javax.xml.bind.annotation.XmlNs; import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema; 

marshaller.setProperty solo funciona en el marshaller JAX-B de Sun. La pregunta era sobre el marcador JAX-B de SpringSource , que no es compatible con setProperty .

Para especificar más de un espacio de nombres para proporcionar prefijos, use algo como:

 @javax.xml.bind.annotation.XmlSchema( namespace = "urn:oecd:ties:cbc:v1", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns ={@XmlNs(prefix="cbc", namespaceURI="urn:oecd:ties:cbc:v1"), @XmlNs(prefix="iso", namespaceURI="urn:oecd:ties:isocbctypes:v1"), @XmlNs(prefix="stf", namespaceURI="urn:oecd:ties:stf:v4")}) 

… en package-info.java