J'utilise Spring WebServiceTemplate pour effectuer un appel de service Web qui utilise JAXB pour générer une requête XML. Mon exigence nécessite que tous les éléments (y compris root) aient un préfixe d'espace de nom (il n'y a qu'un seul espace de nom) dans la demande SOAP.
Ex:
<ns1:Login xmlns:ns1="www.example.com/a">
<ns1:username>abc</ns1:username>
<ns1:password>abc</ns1:password>
</ns1:Login>
Mais je reçois
<Login xmlns="www.example.com/a">
<username>abc<username>
<password>abc<password>
</Login>
xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="www.example.com/a" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ilreq="www.example.com/a" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="Login">
<xs:sequence>
<xs:element name="username" type="xs:string"/>
<xs:element name="password" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Généré Java Classe 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;
Vous voulez savoir comment générer la requête XML avec le préfixe Namespace pour 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 de membre, comme ceci? :
@XmlElement(required = true, namespace = "http://example.com/a")
protected String username;
@XmlElement(required = true, namespace = "http://example.com/a")
protected String password;
Pour notre projet, cela a résolu les problèmes d'espace de noms. Nous devions également créer NameSpacePrefixMappers.
A été confronté à ce problème, résolu en ajoutant package-info dans mon paquet
et le code suivant dedans:
@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;
Une autre méthode consiste à indiquer au commissaire d’alarme de toujours utiliser un certain préfixe.
marshaller.setProperty("com.Sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() {
@Override
public String getPreferredPrefix(String arg0, String arg1, boolean arg2) {
return "ns1";
}
});'
Pour spécifier plusieurs espaces de noms afin de fournir des préfixes, utilisez l'une des méthodes suivantes:
@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
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
.