Benötigen Sie SOAP-Nachrichten für die Client-Gespräch mit externem Web-Service zu sehen - wie? (Eclipse / Netbeans / IDEA ok)

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

Frage

Ich habe eine Situation, wo ich habe einen Client in Java gegen einen sehr pingelig externen Web-Service schreiben (über https) und ich kann an den Web-Service über den Web Services-Explorer in Eclipse Java EE.

sprechen

Leider kann ich nicht der Kunde richtig fragen, bekommen so würde ich wirklich die SOAP-Nachrichten hin und her gerne sehen. Die neu in Web-Services ist dies ein bisschen ein Dschungel. Ich bin sehr vertraut mit Eclipse und habe einige Zeit mit Netbeans und IntelliJ ausgegeben.

Ich würde wirklich, wirklich lieber die Metro Stack, wie es dies auf einem Lager laufen zu lassen Java 6 und Angelegenheiten Bereitstellung Größe. Gibt es eine einfache Möglichkeit, um Metro einzuloggen, was es tut, oder es durch die TCP / IP-Monitore in Eclipse und Netbeans machen sprechen? Die U-Bahn-Dokumentation scheint unter dem Web-Service-Autor und nicht der Kunden in erster Linie ausgerichtet zu sein, so dass ich könnte es leicht zu übersehen.

Haben Sie Vorschläge für ein Setup sagen: „Hier ist die WSDL - generieren mir einen Client, wo ich den Verkehr sehen“?

War es hilfreich?

Lösung 3

Es war hilfreich Anmeldung zu drehen mit

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

in der Eclipse-Startkonfiguration.

Andere Tipps

Sie einfach einen Proxy setzen oder einen TCP-Monitor „in der Mitte“ und Sie werden die Meldung.

Ich habe mit tcpmon für eine ähnliche Aufgabe.

Hier ist eine andere Art und Weise SOAP-Nachrichten zu beachten:

Klassen generiert Client Nimmt man wie folgt aussieht:

// 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();

}

Nun, beim Ausführen folgenden Code:

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

wsClient sollte Instanz zurück, die beide Instanz von RetrieveMyObjects & javax.xml.ws.BindingProvider Schnittstellen ist. Es ist nicht überall auf der Oberfläche von JAX-WS angegeben, aber es scheint, dass eine Menge Code auf dieser Tatsache beruht. Man kann sich wieder versichern, ihn \ selbst durch so etwas ausführen:

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

Nun, wenn wir sicher sind, dass retrieveMyObjectsPort ist Instanz von javax.xml.ws.BindingProvider können wir SOAPMessage Protokollierung durch den Aufruf folgende Verfahren auf jeder gewünschten Web-Service-Port-Schnittstelle aktivieren:

/**
 * 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);

Hope, das hilft

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top