Spring WebServiceTemplateを使用して、JAXBを使用してリクエストXMLを生成するwebservice呼び出しを行います。私の要件では、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を生成する方法を知りたい。
追加することで解決
@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、
このようなメンバー変数に名前空間宣言を設定しようとしましたか? :
@XmlElement(required = true, namespace = "http://example.com/a")
protected String username;
@XmlElement(required = true, namespace = "http://example.com/a")
protected String password;
このプロジェクトでは、名前空間の問題を解決しました。また、NameSpacePrefixMappersを作成する必要がありました。
この問題に直面していた、私のパッケージに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;
別の方法は、マーシャラーに常に特定のプレフィックスを使用するように指示することです
marshaller.setProperty("com.Sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() {
@Override
public String getPreferredPrefix(String arg0, String arg1, boolean arg2) {
return "ns1";
}
});'
プレフィックスを提供するために複数の名前空間を指定するには、次のようなものを使用します。
@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内
marshaller.setProperty
は、SunのJAX-Bマーシャラーでのみ機能します。質問はSpringSource
をサポートしていないsetProperty
のJAX-Bマーシャラーに関するものでした。