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

我正在使用Spring WebServiceTemplate进行webservice调用,它使用JAXB生成请求XML。 我的需求需要所有的元素(包括根)在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; ...... } 

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。

通过添加解决

 @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提供

MSK,

你有没有尝试设置一个名称空间声明到这样的成员variables? :

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

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

另一种方法是告诉编组总是使用某个前缀

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

marshaller.setProperty仅适用于Sun的JAX-B编组器。 问题是关于SpringSource的JAX-B编组器,它不支持setProperty

正面临着这个问题,通过在我的包中添加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;