JAXB: нужен префикс пространства имен для всех элементов - PullRequest
54 голосов
/ 01 августа 2011

Я использую Spring WebServiceTemplate для вызова веб-сервиса, который использует JAXB для генерации XML запроса. Моему требованию нужно, чтобы все элементы (включая root) имели префикс пространства имен (только одно пространство имен) в запросе SOAP.

Пример:

<ns1:Login xmlns:ns1="www.example.com/a">
    <ns1:username>abc</ns1:username>
    <ns1:password>abc</ns1:password>
</ns1:Login>

Но я получаю

<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>

Сгенерированный Java-класс из 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;

Хотите знать, как сгенерировать XML-запрос с префиксом пространства имен для всех элементов, включая root.

Ответы [ 6 ]

74 голосов
/ 12 октября 2011

Решено добавлением

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

в package-info.java

Поступил на помощь jaxb-namespaces-missing : Ответ предоставлен Blaise Doughan

7 голосов
/ 04 октября 2011

MSK,

Вы пытались установить объявление пространства имен для ваших переменных-членов, как это?:

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

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

В нашем проекте решены проблемы с пространством имен.Нам также пришлось создать NameSpacePrefixMappers.

4 голосов
/ 22 мая 2016

Столкнулся с этой проблемой, решил, добавив package-info в мой пакет

и следующий код в нем:

@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;
3 голосов
/ 06 октября 2011

Другой способ - сказать маршаллеру всегда использовать определенный префикс

marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() {
             @Override
            public String getPreferredPrefix(String arg0, String arg1, boolean arg2) {
                return "ns1";
            }
        });'
2 голосов
/ 14 декабря 2017

Чтобы указать несколько пространств имен для предоставления префиксов, используйте что-то вроде:

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

... в package-info.java

2 голосов
/ 17 сентября 2012

marshaller.setProperty работает только на маршаллере JAX-B от Sun.Вопрос касался маршаллера JAX-B из SpringSource, который не поддерживает setProperty.

...