1

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 つを比較できないため、問題が発生しています。

4

2 に答える 2

1

結果は同じです。ns2 は名前空間の単なるプレフィックスです。jaxb はデフォルトの名前空間を使用し、XML Dom はプレフィックス ns2 を使用します。xml ファイルは同等であり、どちらもそのスキーマに対して有効です。XML 名前空間の詳細については、こちらを参照してください。

于 2012-06-15T15:41:59.187 に答える
1

応答は同じですが、名前空間で修飾されていないだけです。

余談ですが、あなたの XML 設計は少し不安定に見えます。このような方が良いかもしれません。

<ProductResponse>
  <product>
    <id>1</id>
    <name>Oranges</name>
  </product>
  <product>
    <id>2</id>
    <name>Apples</name>
  </product>
</ProductResponse>

なんで?要素の順序に依存するべきではないためです。

于 2012-06-15T15:52:35.800 に答える