1

非常にうるさい外部 Web サービス (https 経由) に対して Java でクライアントを作成する必要があり、Eclipse Java EE の Web サービス エクスプローラーを介して Web サービスと通信できます。

残念ながら、クライアントに適切に質問させることができないので、SOAP メッセージが行き来するのを本当に見たいと思っています。Web サービスに慣れていないので、これはちょっとしたジャングルです。私は Eclipse に非常に精通しており、Netbeans と IntelliJ に時間を費やしてきました。

私は本当に、Metro スタックを使用することを本当に好みます。なぜなら、Metro スタックを使用すると、ストック Java 6 で実行でき、デプロイメントのサイズが重要になるからです。Metro にログを記録させたり、Eclipse や Netbeans の TCP/IP モニターを介して通信させたりする簡単な方法はありますか? Metro のドキュメントは、クライアントではなく、主に Web サービスの作成者を対象としているようです。

「ここに WSDL があります。トラフィックを確認できるクライアントを生成してください」というセットアップに関する提案はありますか?

4

3 に答える 3

2

プロキシまたはtcpモニターを「真ん中に」置くだけで、メッセージが表示されます。

私は同様のタスクにtcpmonを使用しています。

于 2010-02-08T13:07:48.207 に答える
2

SOAP メッセージを監視する別の方法を次に示します。

生成されたクライアント クラスが次のようになっているとします。

// generated service class
public class MyWebServiceClient extends javax.xml.ws.Service {
    // ...
    private final QName portName = "...";
    // ...
    public RetrieveMyObjects getRetrieveMyObjects() {
        return super.getPort(portName, RetrieveMyObject.class);
    }
    // ...
}

// generated port interface
// annotations here
public interface RetrieveMyObjects {

    // annotations here
    List<MyObject> getAll();

}

さて、次のコードを実行すると:

MyWebServiceClient wsClient = new MyWebServiceClient("wsdl/location/url/here.wsdl");
RetrieveMyObjectsPort retrieveMyObjectsPort = wsClient.getRetrieveMyObjects();

wsClientRetrieveMyObjects&javax.xml.ws.BindingProviderインターフェイスの両方のインスタンスであるインスタンスを返す必要があります。JAX-WS の表面上はどこにも明記されていませんが、多くのコードはその事実に基づいているようです。次のようなことを実行することで、自分自身を安心させることができます:

if(!(retrieveMyObjectsPort instanceof javax.xml.ws.BindingProvider)) {
    throw new RuntimeException("retrieveMyObjectsPort is not instance of " + BindingProvider.class + ". Redirect following as well as authentication is not possible");
}

retrieveMyObjectsPortのインスタンスであることが確認できたら、必要な各 Web サービス ポート インターフェイスで次のメソッドを呼び出して、ログをjavax.xml.ws.BindingProvider有効にできます。SOAPMessage

/**
 * Enables logging of send and received SOAP messages on the specified {@link BindingProvider}s
 */
private static void enableSoapMessageLogging(final Logger logger, final BindingProvider... bindingProviders) {
    for(final BindingProvider bindingProvider : bindingProviders) {
        final List<Handler> handlerChain = bindingProvider.getBinding().getHandlerChain();
        handlerChain.add(new SOAPHandler<SOAPMessageContext>() {
            @Override
            public boolean handleMessage(final SOAPMessageContext context) {
                try {
                    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    context.getMessage().writeTo(baos);
                    logger.trace(new String(baos.toByteArray()));
                } catch(final Exception e) {
                    logger.error("", e);
                }
                return true;
            }

            @Override
            public boolean handleFault(final SOAPMessageContext context) {
                return true;
            }

            @Override
            public void close(final MessageContext context) {
            }

            @Override
            public Set<QName> getHeaders() {
                return null;
            }
        });
        bindingProvider.getBinding().setHandlerChain(handlerChain);
    }
}

// and somewhere at the beginning of application ...
enableSoapMessageLogging(logger, (BindingProvider) retrieveMyObjectsPort);

お役に立てれば

于 2012-03-19T08:30:30.367 に答える
1

でロギングをオンにすると役に立ちました

-Dcom.sun.xml.ws.assembler.client=true

Eclipse 起動構成で。

于 2010-02-22T18:43:20.560 に答える