JAXB: nécessite un préfixe d’espace de noms pour tous les éléments

J’utilise Spring WebServiceTemplate pour faire un appel Web service qui utilise JAXB pour générer un XML de requête. Mon exigence nécessite que tous les éléments (y compris root) aient un préfixe d’espace de noms (il n’y a qu’un seul espace de noms) dans la requête SOAP.

Ex:

 abc abc  

Mais je reçois

  abc abc  

xsd:

         

Classe Java générée à partir de XSD

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Login", propOrder = { "username", "password" }) @XmlRootElement public class Login { @XmlElement(required = true) protected Ssortingng username; @XmlElement(required = true) protected Ssortingng 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; 

Vous voulez savoir comment générer la requête XML avec le préfixe Namespace à tous les éléments, y compris root.

Résolu en ajoutant

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

dans package-info.java

A pris l’aide de jaxb-namespaces-missing : Réponse fournie par Blaise Doughan

MSK,

Avez-vous essayé de définir une déclaration d’espace de noms pour vos variables membres comme celle-ci? :

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

Pour notre projet, il a résolu les problèmes d’espace de noms. Nous avons également dû créer NameSpacePrefixMappers.

Une autre façon est de dire au marshaller de toujours utiliser un certain préfixe

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

A été confronté à ce problème, résolu en ajoutant des informations de package dans mon package

et le code suivant:

 @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 ne fonctionne que sur le marshaller JAX-B de Sun. La question concernait le marshaller JAX-B de SpringSource , qui ne supporte pas setProperty .

Pour spécifier plusieurs espaces de noms afin de fournir des préfixes, utilisez quelque chose comme:

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

… dans package-info.java