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 als SOAPHandler<SOAPMessageContext>
die In-Memory-DOM-Darstellung.
Hier ist der entscheidende Text aus dem ursprünglichen Blog-Artikel:
MessageHandler:
Unter Verwendung des erweiterbaren Handler-Frameworks der JAX-WS-Spezifikation und der besseren Nachrichtenabstraktion in RI haben wir einen neuen Handler namens (eine Erweiterung von MessageContext) eingeführt. Über MessageHandlerContext kann auf die Nachricht zugegriffen und über die Nachrichten-API verarbeitet werden. Wie ich im Titel des Blogs angegeben habe, können Sie mit diesem Handler an Nachrichten arbeiten. Dies bietet effiziente Möglichkeiten, auf die Nachricht zuzugreifen / sie zu verarbeiten, nicht nur auf eine DOM-basierte Nachricht. Das Programmiermodell der Handler ist das gleiche und die Message-Handler können mit Standard-Logical- und SOAP-Handlern gemischt werden. Ich habe in JAX-WS RI 2.1.3 ein Beispiel hinzugefügt, das die Verwendung von MessageHandler zum Protokollieren von Nachrichten zeigt. Hier ist ein Ausschnitt aus dem Beispiel:MessageHandler
zur Erweiterung Ihrer Webdienstanwendungen . MessageHandler ähnelt SOAPHandler, außer dass Implementierungen davon Zugriff erhaltenMessageHandlerContext
public class LoggingHandler implements MessageHandler<MessageHandlerContext> {
public boolean handleMessage(MessageHandlerContext mhc) {
Message m = mhc.getMessage().copy();
XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out);
try {
m.writeTo(writer);
} catch (XMLStreamException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean handleFault(MessageHandlerContext mhc) {
.....
return true;
}
public void close(MessageContext messageContext) { }
public Set getHeaders() {
return null;
}
}
(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 anderen Handler
. 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 .