JAXB: Need Namespace Prefix a tutti gli elementi

Sto usando Spring WebServiceTemplate per effettuare una chiamata al servizio web che usa JAXB per generare XML di richiesta. Il mio requisito richiede che tutti gli elementi (inclusa la radice) abbiano un prefisso dello spazio dei nomi (c’è solo un singolo spazio dei nomi) nella richiesta SOAP.

Es:

 abc abc  

Ma sto ottenendo

  abc abc  

xsd:

         

Classe Java generata da 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; 

Vuoi sapere come generare la richiesta XML con prefisso Namespace a tutti gli elementi, incluso root.

Risolto aggiungendo

 @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.*; 

in package-info.java

Mi è venuto meno l’aiuto di jaxb-namespaces : la risposta fornita da Blaise Doughan

MSK,

Hai provato a impostare una dichiarazione di namespace sulle variabili membro come questa? :

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

Per il nostro progetto, ha risolto i problemi dello spazio dei nomi. Abbiamo anche dovuto creare NameSpacePrefixMappers.

Un altro modo è di dire al marshaller di usare sempre un certo prefisso

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

Stava affrontando questo problema, Risolto aggiungendo le informazioni sul pacchetto nel mio pacchetto

e il seguente codice in esso:

 @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 funziona solo sul marshaller.setProperty JAX-B di Sun. La domanda riguardava il marshaller JAX-B di SpringSource , che non supporta setProperty .

Per specificare più di un namespace per fornire prefissi, usa qualcosa come:

 @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")}) 

… in package-info.java