190 votes

Traçage de demande XML/réponses avec JAX-WS

Est-il un moyen facile (aka: l'utilisation d'un proxy) pour obtenir l'accès à la crue de demande/réponse XML pour un webservice publié avec JAX-WS implémentation de référence (celle qui est incluse dans le JDK 1.5 et mieux c'est) ? Être en mesure de le faire via le code est ce que je dois faire. Juste l'avoir connecté à un fichier par un habile configuration de journalisation serait sympa mais assez.

Je sais que d'autres plus complexe et complète, il existe des cadres qui pourrait le faire, mais je tiens à le garder aussi simple que possible et de l'axe cxf, etc tous ajoutent beaucoup de frais généraux que je veux éviter.

Merci!

318voto

Mr. Napik Points 735

Suivant les options activer l'enregistrement de toutes les communications avec la console (techniquement, vous avez seulement besoin de l'un de ces, mais cela dépend de l'bibliothèques que vous utilisez, de sorte que le réglage de tous les quatre est l'option la plus sûre). Vous pouvez le définir dans le code comme dans l'exemple, ou en tant que paramètre de ligne de commande à l'aide de -D ou comme une variable d'environnement comme Upendra écrit.

System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true");

Voir la question de Traçage de demande XML/réponses avec JAX-WS quand l'erreur se produit pour plus de détails.

89voto

Antonio Points 481

Voici la solution dans le code brut (mettez-les ensemble grâce à stjohnroe et Shamik):

Endpoint ep = Endpoint.publish("http://my.server.com/mywebservice/", new WebserviceImpl());
ep.getBinding().getHandlerChain().add(new SOAPLoggingHandler());

Où SOAPLoggingHandler est (extraction de lié des exemples):

package com.myfirm.util.logging.ws;

import java.io.PrintStream;
import java.util.Map;
import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

/*
 * This simple SOAPHandler will output the contents of incoming
 * and outgoing messages.
 */
public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {

    // change this to redirect output if desired
    private static PrintStream out = System.out;

    public Set<QName> getHeaders() {
        return null;
    }

    public boolean handleMessage(SOAPMessageContext smc) {
        logToSystemOut(smc);
        return true;
    }

    public boolean handleFault(SOAPMessageContext smc) {
        logToSystemOut(smc);
        return true;
    }

    // nothing to clean up
    public void close(MessageContext messageContext) {
    }

    /*
     * Check the MESSAGE_OUTBOUND_PROPERTY in the context
     * to see if this is an outgoing or incoming message.
     * Write a brief message to the print stream and
     * output the message. The writeTo() method can throw
     * SOAPException or IOException
     */
    private void logToSystemOut(SOAPMessageContext smc) {
        Boolean outboundProperty = (Boolean)
            smc.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY);

        if (outboundProperty.booleanValue()) {
            out.println("\nOutbound message:");
        } else {
            out.println("\nInbound message:");
        }

        SOAPMessage message = smc.getMessage();
        try {
            message.writeTo(out);
            out.println("");   // just to add a newline
        } catch (Exception e) {
            out.println("Exception in handler: " + e);
        }
    }
}

56voto

Upendra Points 301

Avant le démarrage de tomcat, définissez JAVA_OPTS comme ci-dessous dans Linux envs. Puis démarrer Tomcat. Vous verrez la demande et de la réponse dans l' catalina.out le fichier.

export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true"

11voto

skaffman Points 197885

Il y a différentes façons de le faire par programme, comme décrit dans les autres réponses, mais ils sont assez envahissantes mécanismes. Toutefois, si vous savez que vous êtes à l'aide de l'JAX-WS RI (aka "Metro"), alors vous pouvez le faire au niveau de la configuration. Voir ici pour des instructions sur la façon de le faire. Pas besoin de se soucier de votre application.

9voto

TriMix Points 11

// Cette solution fournit un moyen par programmation d'ajouter un gestionnaire pour le web service clien w/o la configuration XML

// Voir plein de doc ici: http://docs.oracle.com/cd/E17904_01//web.1111/e13734/handlers.htm#i222476

// Créer une nouvelle classe qui implémente SOAPHandler

public class LogMessageHandler implements SOAPHandler<SOAPMessageContext> {

@Override
public Set<QName> getHeaders() {
    return Collections.EMPTY_SET;
}

@Override
public boolean handleMessage(SOAPMessageContext context) {
    SOAPMessage msg = context.getMessage(); //Line 1
    try {
        msg.writeTo(System.out);  //Line 3
    } catch (Exception ex) {
        Logger.getLogger(LogMessageHandler.class.getName()).log(Level.SEVERE, null, ex);
    } 
    return true;
}

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

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

// Par programmation à l'ajouter à vos LogMessageHandler

   com.csd.Service service = null;
    URL url = new URL("https://service.demo.com/ResService.svc?wsdl");

    service = new com.csd.Service(url);

    com.csd.IService port = service.getBasicHttpBindingIService();
    BindingProvider bindingProvider = (BindingProvider)port;
    Binding binding = bindingProvider.getBinding();
    List<Handler> handlerChain = binding.getHandlerChain();
    handlerChain.add(new LogMessageHandler());
    binding.setHandlerChain(handlerChain);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X