Web サービス要求の XML ドキュメントを表す JAXB オブジェクト (ProductRequest) があります。次のようになっているとします。
<ProductRequest>
<getProducts/>
</ProductRequests>
応答の場合、JAXB オブジェクト (ProductResponse) は、以下に示すような XML ドキュメントを表します。
<ProductResponse>
<productId>1</productId>
<productName>Oranges</productName>
<productId>2</productId>
<productName>Apples</productName>
</ProductResponse>
Spring-WS を使用すると、2 つの方法で Web サービスにリクエストを送信できます
JAXB オブジェクトの使用
ProductRequest productRequest = new productRequest();
ProductResponse productResponse = (ProductResponse) webServiceTemplate
.marshalSendAndReceive(productRequest);
プレーンな XML/DOM の使用
DOMResult domresult = new DOMResult();
webServiceTemplate.sendSourceAndReceiveToResult(source, domresult); //source represents the XML document as a DOMSource object
Element responseElement = (Element) domresult.getNode().getFirstChild();
両方のアプローチを試すと、結果は異なります。JAXB オブジェクトを使用した最初のアプローチの結果は次のとおりです。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProductResponse xmlns="http://mySchema">
<productId>1</productId>
<productName>Oranges</productName>
<productId>2</productId>
<productName>Apples</productName>
</ProductResponse>
XML Dom オブジェクトを使用した 2 番目のアプローチは、(名前空間を含む)
<?xml version="1.0" encoding="UTF-8"?>
<ns2:ProductResponse xmlns:ns2="http://mySchema">
<ns2:productId>1</ns2:productId>
<ns2:productName>Oranges</ns2:productName>
<ns2:productId>2</ns2:productId>
<ns2:productName>Apples</ns2:productName>
</ns2:ProductResponse>
Web サービスでの応答に使用されるスキーマのヘッダーは、次のように宣言されます。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:z="http://mySchema"
targetNamespace="http://mySchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
-- Schema elements
</xs:schema>
応答には2つの違いがあります
- JAXB 要求からの応答の最初の行には、standalone="yes"> というエントリが含まれています。
- JAXB バージョンの要素には、名前空間のプレフィックスが付いていません
- スキーマの接頭辞が付いた要素を含む応答では、ns2 の代わりに (スキーマで定義されているように) 「z」を使用すべきではありませんか?
両方が同じスキーマに基づいて応答を生成する同じ Web サービスを呼び出していることを考えると、この違いの原因は何なのかわかりません。何か案は?
XML コンテンツは同じですが、XML の形式の違いにより、String.equals() を使用して 2 つを比較できないため、問題が発生しています。