どのように - 外部Webサービスに話しクライアント用のSOAPメッセージを確認する必要がありますか? (OKのEclipse / Netbeansの/ IDEA)

StackOverflow https://stackoverflow.com/questions/2221488

質問

私は(HTTPS上)非常にうるさい外部Webサービスに対してJavaでクライアントを記述する必要が状況を持っていると私は、EclipseのJava EEにおけるWebサービスエクスプローラからWebサービスに話をすることができます。

残念ながら、私は、私は本当にSOAPメッセージを前後に行く見てみたいと思いますので、クライアントが正常に依頼することができません。 Webサービスへの新しいということは、これはジャングルのビットです。私は、Eclipseに精通しています、とNetBeansやIntelliJのといくつかの時間を費やしています。

私は本当に、本当に、これは株式のJava 6で実行することができ、および展開サイズ事項として、メトロ・スタックを使用して好みます。メトロは、それが何をするかログインするか、またはそれは、EclipseやNetBeansでTCP / IPモニターを通じて話を作るようにする簡単な方法はありますか?メトロのドキュメントは、主にWebサービスの作者ではなく、クライアントをターゲットにしているように見えるので、私は簡単にそれを見逃しているかもしれません。

と言ってセットアップのための任意の提案、「ここでは、WSDLがある - 私がトラフィックを見ることができるクライアントを生成」?

役に立ちましたか?

解決 3

とロギングをオンに役立ちました
-Dcom.sun.xml.ws.assembler.client=true

Eclipseの起動設定インチ

他のヒント

ただ、「途中で」プロキシまたはTCPモニタを入れて、次のメッセージが表示されます。

私は、同様のタスクのために tcpmonのに使用してきた。

ここで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();

wsClientRetrieveMyObjectsjavax.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");
}

さて、私たちはretrieveMyObjectsPortjavax.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);

ホープ、このことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top