Besoin de voir les messages SOAP pour le client parler au service Web externe - comment? (Ok Eclipse / Netbeans / IDEA)

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

Question

J'ai une situation où je dois écrire un client en Java sur un service Web externe très pointilleux (sur https) et je peux parler au service Web via les Services Web Explorer dans Eclipse Java EE.

Malheureusement, je ne peux pas le client de demander correctement donc je voudrais vraiment voir les messages SOAP qui vont et viennent. Être nouveau aux services Web, il est un peu une jungle. Je suis très familier avec Eclipse, et ont passé un certain temps avec Netbeans et IntelliJ.

Je voudrais vraiment, préfère vraiment en utilisant la pile de métro car il permet cela fonctionne sur un stock Java 6, et les questions de la taille du déploiement. Yat-il un moyen simple de faire se connecter Metro ce qu'il fait, ou faire parler à travers les moniteurs TCP / IP dans Eclipse et Netbeans? La documentation Metro semble cibler principalement l'auteur du service Web et non le client, donc je pourrais facilement avoir manqué.

Toutes les suggestions pour une configuration disant: « Voici le WSDL - me générer un client où je peux voir le trafic »?

Était-ce utile?

La solution 3

Il a été utile pour activer la connexion avec

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

dans la configuration de lancement Eclipse.

Autres conseils

Il suffit de mettre un proxy ou un moniteur tcp « au milieu » et vous verrez le message.

Je me sers tcpmon pour une tâche similaire.

Voici une autre façon d'observer les messages SOAP:

Supposant classes client générées ressemble à:

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

}

, lors de l'exécution du code suivant:

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

wsClient devrait revenir par exemple qui est à la fois instance d'interfaces RetrieveMyObjects et javax.xml.ws.BindingProvider. Il ne dit nulle part sur la surface de JAX-WS, mais il semble que beaucoup de code est basé sur ce fait. On peut le rassurer \ elle-même en exécutant quelque chose comme:

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

Maintenant, quand nous sommes sûrs que retrieveMyObjectsPort est instance de javax.xml.ws.BindingProvider nous pouvons activer la journalisation de SOAPMessage en invoquant la méthode suivante sur chaque interface de port de service Web souhaité:

/**
 * 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 this helps

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top