Gibt es eine einfache Möglichkeit (auch bekannt als: kein Proxy verwenden), um Zugriff auf das unformatierte Anforderungs- / Antwort-XML für einen Webservice zu erhalten, der mit der JAX-WS-Referenzimplementierung veröffentlicht wurde (die in JDK 1.5 und höher enthalten ist)? Das über Code tun zu können, ist das, was ich tun muss. Nur durch clevere Protokollierungskonfigurationen in einer Datei protokolliert zu werden, wäre schön, aber genug.
Ich weiß, dass es andere komplexere und vollständigere Frameworks gibt, die dies tun könnten, aber ich möchte es so einfach wie möglich halten und Achse, CXF usw. verursachen einen erheblichen Overhead, den ich vermeiden möchte.
Vielen Dank!
java
web-services
jax-ws
Antonio
quelle
quelle
Antworten:
Die folgenden Optionen ermöglichen die Protokollierung der gesamten Kommunikation an der Konsole (technisch gesehen benötigen Sie nur eine davon, dies hängt jedoch von den verwendeten Bibliotheken ab, sodass die Einstellung aller vier sicherer ist). Sie können es im Code wie im Beispiel oder als Befehlszeilenparameter mit -D oder als Umgebungsvariable festlegen, wie Upendra geschrieben hat.
Weitere Informationen finden Sie in der Frage Verfolgen von XML-Anforderungen / -Antworten mit JAX-WS, wenn ein Fehler auftritt .
quelle
Hier ist die Lösung in Rohcode (zusammengestellt dank stjohnroe und Shamik):
Wo sich SOAPLoggingHandler befindet (aus verknüpften Beispielen herausgerissen):
quelle
ep.publish(publishURL);
: Was istpublishURL
(In meinem Code ist die WSDL-URL im Dienst selbst enthalten; ich habe keine URL außerhalb. Was vermisse ich?)JAVA_OPTS
Stellen Sie vor dem Starten von Tomcat die folgenden Einstellungen in Linux envs ein. Starten Sie dann Tomcat. Sie sehen die Anfrage und Antwort in dercatalina.out
Datei.quelle
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
Legen Sie die folgenden Systemeigenschaften fest. Dadurch wird die XML-Protokollierung aktiviert. Sie können es in Java oder Konfigurationsdatei einstellen.
Konsolenprotokolle:
quelle
Injizieren
SOAPHandler
in Endpunktschnittstelle. Wir können die SOAP-Anforderung und -Antwort verfolgenSOAPHandler mit Programmatic implementieren
Deklarativ durch Hinzufügen von
@HandlerChain(file = "handlers.xml")
Anmerkungen zu Ihrer Endpunktschnittstelle.handlers.xml
SOAPLoggingHandler.java
quelle
Es gibt verschiedene Möglichkeiten, dies programmgesteuert zu tun, wie in den anderen Antworten beschrieben, aber es handelt sich um ziemlich invasive Mechanismen. Wenn Sie jedoch wissen, dass Sie JAX-WS RI (auch bekannt als "Metro") verwenden, können Sie dies auf Konfigurationsebene tun. Anweisungen dazu finden Sie hier. Sie müssen nicht mit Ihrer Anwendung herumspielen.
quelle
// Diese Lösung bietet eine Möglichkeit, dem Webdienst-Clien ohne XML-Konfiguration programmgesteuert einen Handler hinzuzufügen
// Das vollständige Dokument finden Sie hier: http://docs.oracle.com/cd/E17904_01//web.1111/e13734/handlers.htm#i222476
// Neue Klasse erstellen, die SOAPHandler implementiert
// Fügen Sie Ihren LogMessageHandler programmgesteuert hinzu
quelle
Ich poste eine neue Antwort, da ich nicht genug Ruf habe, um die von Antonio bereitgestellte zu kommentieren (siehe: https://stackoverflow.com/a/1957777 ).
Wenn Sie möchten, dass die SOAP-Nachricht in einer Datei gedruckt wird (z. B. über Log4j), können Sie Folgendes verwenden:
Bitte beachten Sie, dass sich der Methodenaufruf writeTo () unter bestimmten Umständen nicht wie erwartet verhält (siehe: https://community.oracle.com/thread/1123104?tstart=0 oder https://www.java.net/node) / 691073 ), daher reicht der folgende Code aus:
quelle
Sie müssen einen javax.xml.ws.handler.LogicalHandler implementieren. Dieser Handler muss dann in einer Handler-Konfigurationsdatei referenziert werden, auf die wiederum durch eine @ HandlerChain-Annotation in Ihrem Service-Endpunkt (Schnittstelle oder Implementierung) verwiesen wird. Sie können die Nachricht dann entweder über system.out oder einen Logger in Ihrer processMessage-Implementierung ausgeben.
Sehen
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
quelle
Die hier aufgeführten Antworten, die Sie verwenden sollen,
SOAPHandler
sind vollständig korrekt. Der Vorteil dieses Ansatzes besteht darin, dass er mit jeder JAX-WS-Implementierung funktioniert, da SOAPHandler Teil der JAX-WS-Spezifikation ist. Das Problem mit SOAPHandler besteht jedoch darin, dass implizit versucht wird, die gesamte XML-Nachricht im Speicher darzustellen. Dies kann zu einer enormen Speichernutzung führen. Verschiedene Implementierungen von JAX-WS haben hierfür eigene Problemumgehungen hinzugefügt. Wenn Sie mit großen Anfragen oder großen Antworten arbeiten, müssen Sie einen der proprietären Ansätze prüfen.Da Sie nach "dem in JDK 1.5 oder besser enthaltenen" fragen, antworte ich in Bezug auf das, was formal als JAX-WS RI (auch bekannt als Metro) bekannt ist und was im JDK enthalten ist.
JAX-WS RI hat hierfür eine spezielle Lösung, die hinsichtlich der Speichernutzung sehr effizient ist.
Siehe https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . Leider ist dieser Link jetzt defekt, aber Sie können ihn auf WayBack Machine finden. Ich werde die Highlights unten geben:
Die U - Bahn - Leute im Jahr 2007 eingeführt einen zusätzlichen Handler - Typen,
MessageHandler<MessageHandlerContext>
, die Metro proprietär ist. Es ist weitaus effizienter alsSOAPHandler<SOAPMessageContext>
die In-Memory-DOM-Darstellung.Hier ist der entscheidende Text aus dem ursprünglichen Blog-Artikel:
(Endzitat aus dem Blogbeitrag 2007)
Es ist unnötig zu erwähnen, dass Ihr benutzerdefinierter Handler
LoggingHandler
im Beispiel zu Ihrer Handler-Kette hinzugefügt werden muss, um einen Effekt zu erzielen. Dies ist dasselbe wie das Hinzufügen eines anderenHandler
. Sie können also in den anderen Antworten auf dieser Seite nachsehen, wie das geht.Ein vollständiges Beispiel finden Sie im Metro GitHub-Repo .
quelle
Sie können versuchen, eine
ServletFilter
vor den Webservice zu stellen und die Anforderung und Antwort zu überprüfen, die an den Service gesendet oder von diesem zurückgegeben wird.Obwohl Sie ausdrücklich nicht nach einem Proxy gefragt haben, finde ich manchmal, dass tcptrace ausreicht, um zu sehen, was bei einer Verbindung vor sich geht. Es ist ein einfaches Tool, keine Installation, es zeigt die Datenströme an und kann auch in eine Datei schreiben.
quelle
Zur Laufzeit können Sie einfach ausführen
as dump ist eine öffentliche Variable, die in der Klasse wie folgt definiert ist
quelle
Habe ich Recht, wenn ich verstehe, dass Sie die unformatierte XML-Nachricht ändern / darauf zugreifen möchten?
In diesem Fall möchten Sie (oder da dies fünf Jahre alt ist, der nächste) möglicherweise einen Blick auf die Provider-Oberfläche werfen, die Teil von JAXWS ist. Das Client-Gegenstück wird mit der Klasse "Dispatch" erstellt. Auf jeden Fall müssen Sie keine Handler oder Interceptors hinzufügen. Das kannst du natürlich immer noch. Der Nachteil ist, dass Sie VOLLSTÄNDIG für die Erstellung der SOAPMessage verantwortlich sind, aber es ist einfach, und wenn Sie dies möchten (wie ich), ist dies perfekt.
Hier ist ein Beispiel für die Serverseite (etwas ungeschickt, es war nur zum Experimentieren) -
Sie veröffentlichen es wie ein SEI,
Oder Sie können eine Endpoint-Klasse dafür verwenden. Hoffe das war hilfreich.
Und oh, wenn Sie möchten, müssen Sie sich nicht mit Headern und anderen Dingen befassen, wenn Sie den Servicemodus auf PAYLOAD ändern (Sie erhalten nur den Seifenkörper).
quelle
Mit den Konfigurationsdateien logback.xml können Sie Folgendes tun:
Dadurch werden die Anforderung und die Antwort wie folgt protokolliert (abhängig von Ihrer Konfiguration für die Protokollausgabe):
quelle
Ich hatte einige Tage lang versucht, eine Framework-Bibliothek zu finden, um die Seifenanforderung und -antwort des Webdienstes zu protokollieren. Der folgende Code hat das Problem für mich behoben:
quelle
Eine Möglichkeit besteht darin, nicht Ihren Code zu verwenden, sondern Netzwerkpaket-Sniffer wie Etheral oder WireShark zu verwenden, die das HTTP-Paket mit der XML-Nachricht als Nutzlast erfassen und sie weiterhin in einer Datei oder so protokollieren können.
Ein ausgefeilterer Ansatz besteht jedoch darin, eigene Nachrichtenhandler zu schreiben. Sie können es hier ansehen .
quelle
Tatsächlich. Wenn Sie sich die Quellen von HttpClientTransport ansehen, werden Sie feststellen, dass auch Nachrichten in java.util.logging.Logger geschrieben werden. Das heißt, Sie können diese Nachrichten auch in Ihren Protokollen sehen.
Wenn Sie beispielsweise Log4J2 verwenden, müssen Sie lediglich Folgendes tun:
Nach diesen Schritten werden SOAP-Nachrichten in Ihren Protokollen angezeigt.
quelle
In diesem Thread gibt es einige Antworten mit SoapHandlers. Sie sollten wissen, dass SoapHandlers die Nachricht ändern, wenn sie
writeTo(out)
aufgerufen wird.Durch Aufrufen der SOAPMessage-
writeTo(out)
Methode wird auch automatisch diesaveChanges()
Methode aufgerufen . Infolgedessen gehen alle angehängten MTOM / XOP-Binärdaten in einer Nachricht verloren.Ich bin nicht sicher, warum dies geschieht, aber es scheint eine dokumentierte Funktion zu sein.
https://docs.oracle.com/javase/7/docs/api/javax/xml/soap/SOAPMessage.html#saveChanges ()
quelle
Wenn Sie zufällig einen IBM Liberty-App-Server ausführen , fügen Sie einfach ibm-ws-bnd.xml in das Verzeichnis WEB-INF ein.
quelle