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 que SOAPHandler<SOAPMessageContext>
de ne pas essayer de faire une représentation DOM en mémoire.
Voici le texte crucial de l'article original du blog:
MessageHandler:
En utilisant le framework extensible Handler fourni par JAX-WS Specification et la meilleure abstraction de Message dans RI, nous avons introduit un nouveau gestionnaire appeléMessageHandler
pour étendre vos applications de service Web. MessageHandler est similaire à SOAPHandler, sauf que ses implémentations ont accès àMessageHandlerContext
(une extension de MessageContext). Grâce à MessageHandlerContext, on peut accéder au Message et le traiter à l'aide de l'API Message. Comme je l'ai indiqué dans le titre du blog, ce gestionnaire vous permet de travailler sur Message, qui fournit des moyens efficaces d'accéder / traiter le message et pas seulement un message basé sur DOM. Le modèle de programmation des gestionnaires est le même et les gestionnaires de messages peuvent être mélangés avec les gestionnaires standard Logical et SOAP. J'ai ajouté un exemple dans JAX-WS RI 2.1.3 montrant l'utilisation de MessageHandler pour consigner les messages et voici un extrait de l'exemple:
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;
}
}
(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 autre Handler
, 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 .