Подтвердить что ты не робот

JAXB: требуется префикс пространства имен для всех элементов

Я использую Spring WebServiceTemplate, чтобы сделать вызов webservice, который использует 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-запрос с префиксом Namespace ко всем элементам, включая root.

4b9b3361

Ответ 1

Решено путем добавления

@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: Ответ предоставлен Блейз Дохан

Ответ 2

ММС,

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Столкнулся с этой проблемой, решил, добавив 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;

Ответ 6

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

@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