JAXB :所有元素都需要命名空间前缀

2022-08-31 15:09:27

我正在使用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>

从 XSD 生成的 Java 类

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

包信息.java

@javax.xml.bind.annotation.XmlSchema(
    namespace = "www.example.com/a",
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package authenticator.beans.login;

想知道如何为所有元素(包括 root)生成具有命名空间前缀的请求 XML。


答案 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.*;

在包信息中.java

帮助jaxb-namespaces-missing :答案由Blaise Doughan提供


答案 2

MSK,

您是否尝试过像这样为成员变量设置命名空间声明?:

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

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

对于我们的项目,它解决了命名空间问题。我们还必须创建NameSpacePrefixMappers。


推荐