web-dev-qa-db-fra.com

JAXB: Besoin d'un préfixe d'espace de noms pour tous les éléments

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.

54
Sai Kumar

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

74
Sai Kumar

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.

7
Pat B

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;
5
Mohan Seth

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";
            }
        });'
3
devnoo

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

2
D. Thorne

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.

2
A. Rick