7

(この質問のフォローアップ: Geting raw XML response from Java web service client )

Web サービス応答の生の XML を取得できる SOAP メッセージ ハンドラーがあります。この XML を Web サービス クライアントに取り込む必要があるため、応答を途中で送信する前に応答に対して XSL 変換を実行できます。着信メッセージをキャッチし、生の XML を (WSDL から) 生成された Web サービス クライアントで使用できるようにする SOAP ハンドラーからデータを取得する良い方法を見つけるのに苦労しています。これが実現可能かどうかのアイデアはありますか?


私はこのようなものを思いついた:

public class CustomSOAPHandler implements javax.xml.ws.handler.soap.SOAPHandler<javax.xml.ws.handler.soap.SOAPMessageContext>
{
    private String myXML;
    public String getMyXML()
    {
        return myXML;
    }
    ...
    public boolean handleMessage(SOAPMessageContext context)
    {
        ...
        myXML = this.getRawXML(context.getMessage());
    }

    //elsewhere in the application:
    ...
    myService.doSomething(someRequest);
    for (Handler h: ((BindingProvider)myService).getBinding().getHandlerChain())
    {
        if (h instanceof CustomSOAPHandler )
        {
            System.out.println("HandlerResult: "+ ((CustomSOAPHandler )h).getMyXML());
        }
    }

非常に単純なテストでは、これは機能しているようです。しかし、このソリューションは安っぽいハックのように感じます。生の XML をチェーン ハンドラーのメンバーとして設定するのは好きではありません。これは他の多くのベスト プラクティスに違反していると感じています。誰かがこれを行うためのよりエレガントな方法を持っていますか?

4

4 に答える 4

4

私にとってうまくいくように思われた2つの選択肢は、両方ともここに文書化されています。ThreadLocal の使用が問題ないかどうかについては、まだ応答を受け取っていませんが、そうすべきではない理由がわかりません。

元の質問に追加された私の2番目の方法は、ハンドラーのルートに行くことでした。WS コールアウトをデバッグしているときに、invocationProperties マップが responseContext オブジェクト内の内部パケット構造の一部として SOAP 応答を持っていることに気付きましたが、それに到達する方法がないように見えました。ResponseContext は名前と値のペアのセットでした。ただし、この場所で ResponseContext のソース コードを読むと、、get メソッドのコードに、Application Scoped プロパティが見つからない場合は null を返すというコメントがあり、それ以外の場合は、パケットの invocationProperties から読み取るというコメントがありました。そこで、キーと値のペアにスコープを設定する方法を探しました (Google: jaxws のアプリケーション スコープ プロパティの設定) で、コンテキストがそれを控えめに紹介していました。参照した jax-ws 仕様にありました他のスレッド。

また、パケットhttps://jax-ws.java.net/nonav/jax-ws-20-fcs/arch/com/sun/xml/ws/api/message/Packet.htmlについても読みました。

これがあなたにとって意味があることを願っています。Web サービスの呼び出しで Soap FAULT が発生した場合、3 は JAXB を使用するものではないのではないかと心配していました。このパケットは、今日まで番号を持つ Payment Gateway から返されていたため、ログに記録したかったのです。文書化されていない結果の。

幸運を。

于 2013-05-23T15:46:26.217 に答える
2

解決策は、JAXB を使用してオブジェクトを XML に変換することでした。Web サービス クライアントが XML を受信して​​ POJO に変換し、その POJO を XML に変換し直すのは冗長に思えるため、私は実際にはこれを行いたくありませんでしたが、機能します。

于 2012-08-24T15:56:30.260 に答える