Existe-t-il un moyen simple (alias: ne pas utiliser de proxy) pour accéder au XML de demande / réponse brute pour un service Web publié avec l'implémentation de référence JAX-WS (celle incluse dans JDK 1.5 et supérieur)? Être capable de le faire via le code est ce que je dois faire. Le simple fait de le connecter à un fichier par des configurations de journalisation intelligentes serait bien mais suffisant.
Je sais qu'il existe d'autres cadres plus complexes et complets qui pourraient faire cela, mais je voudrais que cela reste aussi simple que possible et axis, cxf, etc. ajoutent tous des frais généraux considérables que je veux éviter.
Merci!
java
web-services
jax-ws
Antonio
la source
la source
Réponses:
Les options suivantes activent la journalisation de toutes les communications avec la console (techniquement, vous n'en avez besoin que de l'une d'entre elles, mais cela dépend des bibliothèques que vous utilisez, donc la configuration des quatre est une option plus sûre). Vous pouvez le définir dans le code comme dans l'exemple, ou comme paramètre de ligne de commande en utilisant -D ou comme variable d'environnement comme Upendra l'a écrit.
Voir la question Traçage des requêtes / réponses XML avec JAX-WS en cas d'erreur pour plus de détails.
la source
Voici la solution en code brut (mise en place grâce à stjohnroe et Shamik):
Où SOAPLoggingHandler est (extrait d'exemples liés):
la source
ep.publish(publishURL);
: qu'est-ce que c'estpublishURL
(dans mon code, l'url wsdl est incluse dans le service lui-même; je n'ai pas d'url à l'extérieur. Qu'est-ce que je manque?)Avant de démarrer tomcat, définissez
JAVA_OPTS
comme ci-dessous dans les environnements Linux. Puis démarrez Tomcat. Vous verrez la demande et la réponse dans lecatalina.out
fichier.la source
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
Définissez les propriétés système suivantes, cela activera la journalisation XML. Vous pouvez le définir dans java ou dans un fichier de configuration.
journaux de la console:
la source
Injecter
SOAPHandler
dans l'interface du point final. nous pouvons tracer la demande et la réponse SOAPImplémentation de SOAPHandler avec programmatique
Déclaratif en ajoutant une
@HandlerChain(file = "handlers.xml")
annotation à votre interface de point de terminaison.handlers.xml
SOAPLoggingHandler.java
la source
Il existe différentes façons de faire cela par programme, comme décrit dans les autres réponses, mais ce sont des mécanismes assez invasifs. Cependant, si vous savez que vous utilisez le JAX-WS RI (aka "Metro"), vous pouvez le faire au niveau de la configuration. Voir ici pour savoir comment procéder. Inutile de vous soucier de votre application.
la source
// Cette solution fournit un moyen d'ajouter par programme un gestionnaire au client du service Web sans la configuration XML
// Voir la documentation complète ici: http://docs.oracle.com/cd/E17904_01//web.1111/e13734/handlers.htm#i222476
// Créer une nouvelle classe qui implémente SOAPHandler
// Ajoutez votre LogMessageHandler par programme
la source
Je poste une nouvelle réponse, car je n'ai pas assez de réputation pour commenter celle fournie par Antonio (voir: https://stackoverflow.com/a/1957777 ).
Si vous souhaitez que le message SOAP soit imprimé dans un fichier (par exemple via Log4j), vous pouvez utiliser:
Veuillez noter que dans certaines circonstances, l'appel de méthode writeTo () peut ne pas se comporter comme prévu (voir: https://community.oracle.com/thread/1123104?tstart=0 ou https://www.java.net/node / 691073 ), donc le code suivant fera l'affaire:
la source
Vous devez implémenter un javax.xml.ws.handler.LogicalHandler, ce gestionnaire doit ensuite être référencé dans un fichier de configuration de gestionnaire, qui à son tour est référencé par une annotation @HandlerChain dans votre point de terminaison de service (interface ou implémentation). Vous pouvez ensuite afficher le message via system.out ou un enregistreur dans votre implémentation processMessage.
Voir
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/twbs_jaxwshandler.html
http://java.sun.com/mailers/techtips/enterprise/2006/TechTips_June06.html
la source
Les réponses énumérées ici qui vous guident à utiliser
SOAPHandler
sont tout à fait correctes. L'avantage de cette approche est qu'elle fonctionnera avec n'importe quelle implémentation JAX-WS, car SOAPHandler fait partie de la spécification JAX-WS. Cependant, le problème avec SOAPHandler est qu'il tente implicitement de représenter l'ensemble du message XML en mémoire. Cela peut entraîner une énorme utilisation de la mémoire. Diverses implémentations de JAX-WS ont ajouté leurs propres solutions de contournement pour cela. Si vous travaillez avec des demandes volumineuses ou des réponses volumineuses, vous devez vous pencher sur l'une des approches propriétaires.Puisque vous posez des questions sur "celui inclus dans JDK 1.5 ou mieux", je répondrai en ce qui concerne ce qui est officiellement connu sous le nom de JAX-WS RI (alias Metro) qui est ce qui est inclus avec le JDK.
JAX-WS RI a pour cela une solution spécifique qui est très efficace en termes d'utilisation de la mémoire.
Voir https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . Malheureusement, ce lien est maintenant rompu mais vous pouvez le trouver sur WayBack Machine. Je vais vous donner les faits saillants ci-dessous:
Les gens de Metro en 2007 ont introduit un type de gestionnaire supplémentaire
MessageHandler<MessageHandlerContext>
, qui est la propriété de Metro. C'est beaucoup plus efficace queSOAPHandler<SOAPMessageContext>
de ne pas essayer de faire une représentation DOM en mémoire.Voici le texte crucial de l'article original du blog:
(citation de fin du billet de blog 2007)
Inutile de dire que votre gestionnaire personnalisé,
LoggingHandler
dans l'exemple, doit être ajouté à votre chaîne de gestionnaire pour avoir un effet. C'est la même chose que l'ajout de tout autreHandler
, vous pouvez donc regarder dans les autres réponses sur cette page pour savoir comment faire cela.Vous pouvez trouver un exemple complet dans le repo Metro GitHub .
la source
Vous pouvez essayer de mettre un
ServletFilter
devant le service Web et d'inspecter la demande et la réponse envoyées / renvoyées par le service.Bien que vous n'ayez spécifiquement pas demandé de proxy, je trouve parfois que tcptrace est suffisant pour voir ce qui se passe sur une connexion. C'est un outil simple, pas d'installation, il affiche les flux de données et peut également écrire dans un fichier.
la source
Au runtime, vous pouvez simplement exécuter
as dump est une variable publique définie dans la classe comme suit
la source
ai-je raison de comprendre que vous souhaitez modifier / accéder au message XML brut?
Si tel est le cas, vous (ou depuis l'âge de cinq ans, le prochain) voudrez peut-être jeter un coup d'œil à l'interface du fournisseur qui fait partie de JAXWS. La contrepartie client se fait à l'aide de la classe "Dispatch". Quoi qu'il en soit, vous n'avez pas besoin d'ajouter de gestionnaires ou d'intercepteurs. Vous pouvez toujours, bien sûr. L'inconvénient est que vous êtes COMPLÈTEMENT responsable de la construction du SOAPMessage, mais c'est facile, et si c'est ce que vous voulez (comme je l'ai fait), c'est parfait.
Voici un exemple pour le côté serveur (un peu maladroit, c'était juste pour expérimenter) -
Vous le publiez comme un SEI,
Ou vous pouvez utiliser une classe Endpoint pour cela. J'espère que cela a été utile.
Et oh, si vous voulez, vous n'avez pas besoin de gérer les en-têtes et autres choses, si vous changez le mode de service sur PAYLOAD (vous n'obtiendrez que le corps de savon).
la source
avec les fichiers de configuration logback.xml, vous pouvez faire:
Cela enregistrera la demande et la réponse comme ceci (en fonction de votre configuration pour la sortie du journal):
la source
J'avais essayé de trouver une bibliothèque de cadres pour enregistrer la demande et la réponse de savon du service Web pendant quelques jours. Le code ci-dessous a résolu le problème pour moi:
la source
Une façon de faire consiste à ne pas utiliser votre code mais à utiliser des renifleurs de paquets réseau comme Etheral ou WireShark qui peuvent capturer le paquet HTTP avec le message XML comme charge utile et vous pouvez continuer à les enregistrer dans un fichier ou plus.
Mais une approche plus sophistiquée consiste à écrire vos propres gestionnaires de messages. Vous pouvez le consulter ici .
la source
Réellement. Si vous regardez dans les sources de HttpClientTransport, vous remarquerez qu'il écrit également des messages dans java.util.logging.Logger. Ce qui signifie que vous pouvez également voir ces messages dans vos journaux.
Par exemple, si vous utilisez Log4J2, tout ce que vous avez à faire est ce qui suit:
Après ces étapes, vous commencez à voir les messages SOAP dans vos journaux.
la source
Il y a quelques réponses à l'aide de SoapHandlers dans ce fil. Vous devez savoir que SoapHandlers modifie le message s'il
writeTo(out)
est appelé.L'appel de la
writeTo(out)
méthode SOAPMessage appelle également la méthode automatiquementsaveChanges()
. En conséquence, toutes les données binaires MTOM / XOP attachées dans un message sont perdues.Je ne sais pas pourquoi cela se produit, mais cela semble être une fonctionnalité documentée.
https://docs.oracle.com/javase/7/docs/api/javax/xml/soap/SOAPMessage.html#saveChanges ()
la source
Si vous exécutez un serveur d'applications IBM Liberty, ajoutez simplement ibm-ws-bnd.xml dans le répertoire WEB-INF.
la source