Bisogno di vedere i messaggi SOAP per il client di parlare con il servizio web esterno - come? (Eclipse / Netbeans / IDEA ok)

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

Domanda

Ho una situazione in cui devo scrivere un client in Java contro un servizio web esterno molto esigente (su HTTPS) e posso parlare con il servizio web attraverso il Web Services Explorer in Eclipse Java EE.

Purtroppo non posso ottenere il cliente a chiedere propriamente mi piacerebbe molto vedere i messaggi SOAP che vanno avanti e indietro. Essendo nuovo ai servizi web questo è un po 'una giungla. Sono molto familiarità con Eclipse, e hanno trascorso un po 'di tempo con Netbeans e IntelliJ.

Mi piacerebbe davvero, davvero preferisco utilizzando lo stack della metropolitana in quanto consente di eseguire questo su uno stock di Java 6, e le dimensioni contano distribuzione. C'è un modo semplice per fare Metro registrare ciò che fa, o farlo parlare attraverso i monitor TCP / IP in Eclipse e Netbeans? La documentazione Metro sembra essere rivolta soprattutto agli dell'autore servizio web e non il cliente, così ho potuto facilmente perso.

Qualche suggerimento per una messa a punto che dice "Ecco il WSDL - mi generare un client dove posso vedere il traffico"?

È stato utile?

Soluzione 3

E 'stato utile per attivare la registrazione con

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

nella configurazione di lancio di Eclipse.

Altri suggerimenti

Basta mettere un proxy o un monitor tcp "nel mezzo" e vedrete il messaggio.

Ho usato tcpmon per un compito simile.

Ecco un altro modo di osservare i messaggi SOAP:

Supponendo che le classi client generato assomiglia:

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

}

Ora, dopo l'esecuzione di codice seguente:

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

wsClient dovrebbe restituire esempio che è sia istanza di interfacce RetrieveMyObjects & javax.xml.ws.BindingProvider. Non è indicato da nessuna parte sulla superficie di JAX-WS, ma sembra che un sacco di codice si basa su questo fatto. Lo si può rassicurare \ stessa eseguendo qualcosa del tipo:

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

Ora, quando siamo sicuri che retrieveMyObjectsPort è istanza di javax.xml.ws.BindingProvider possiamo attivare la registrazione SOAPMessage invocando seguente metodo su ogni interfaccia porta di servizio Web desiderato:

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

Spero che questo aiuti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top