6

String に変換された XML ドキュメントをすべて返す多くのメソッドを持つ JAX-WS エンドポイントがあります。

これは Sun Java System Application Server 9.1 Update 2 でしばらくの間正常に機能していましたが、新しいサーバーにデプロイする必要があります。

1 つの小さな問題を除いて、問題なく Glassfish 3.0.1 にデプロイされました。元の応答例の抜粋:

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:getTransactionTypesResponse xmlns:ns2="http://myns.com.au/">
      <return xmlns="">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;my_xml version="1.2" query_date=""&gt;
  &lt;add_transaction_type description="Contributions" name="Contribution" type="C"/&gt;
  &lt;add_transaction_type description="Transfer In" name="Xfr or R/O In" type="X"/&gt;
&lt;/my_xml&gt;
      </return>
    </ns2:getTransactionTypesResponse>
  </S:Body>
</S:Envelope>

新しいサーバーでは、次のように返されます。

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:getTransactionTypesResponse xmlns:ns2="http://myns.com.au/">
      <return>&lt;?xml version="1.0" encoding="UTF-8"?>

&lt;myxml version="1.2" query_date="">
  &lt;add_transaction_type description="Contributions" name="Contribution" type="C"/>
  &lt;add_transaction_type description="Administration Fee" name="Fee:AUM" type="U"/>
&lt;/my_xml>
      </return>
    </ns2:getTransactionTypesResponse>
  </S:Body>
</S:Envelope>

ほぼ同じですが、左山括弧だけがエスケープされ、右山括弧はエスケープされません。

直接の HTTP POST リクエストを使用してこれをテストしたので、クライアント コードによって破壊されていないことがわかっています。

サーバーをGlassfish 3.1に再度アップグレードしましたが、含まれているWebサービスライブラリに問題があると思っていましたが、うまくいきませんでした。私のアプリケーションは、glassfish の Web サービス サポートに完全に依存しています。独自の WS または XML ライブラリは含まれていません。

エンドポイントは、基本的に次のように定義されます。

@WebService
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
public class MyEndpoint {
  @WebMethod()
  public String getTransactionTypes() {
    return someMethodThatReturnsXmlString();
  }
}

サービスの消費者としてそれを観察したこの投稿者からの参照を除いて、この問題を抱えている人を他に見つけることができませんでした

これは公開されたサービスであるため、消費者がクライアントを更新してこれを処理できることに依存することはできません。興味深いことに、生成された Java クライアントを使用する既存のテスト インターフェースは問題ないように見えますが、これに頼ることはできません。

誰かがこれに遭遇し、それを解決できましたか? WS フレームワークにフックして、回避策として独自のエスケープを行う方法はありますか?

前もって感謝します。

4

1 に答える 1

4

http://www.w3.org/TR/xml/#syntax、セクション2.4から

アンパサンド文字(&)と左山括弧(<)は、マークアップ区切り文字として、またはコメント、処理命令、またはCDATAセクション内で使用される場合を除いて、リテラル形式で表示してはなりません。他の場所で必要な場合は、数字参照または文字列「&」と「<」をそれぞれ使用してエスケープする必要があります。直角ブラケット(>)は、文字列 ">"を使用して表すことができ、互換性のために、コンテンツの文字列 "]]>"に表示される場合は、">"または文字参照を使用してエスケープする必要があります。文字列はCDATAセクションの終わりを示していません。

直角ブラケット(>)はエスケープできるが、エスケープする必要はないので、問題ないはずです。

于 2011-03-07T20:53:32.260 に答える