Las respuestas enumeradas aquí que lo guían para usar SOAPHandler son completamente correctas. El beneficio de ese enfoque es que funcionará con cualquier implementación JAX-WS, ya que SOAPHandler es parte de la especificación JAX-WS. Sin embargo, el problema con SOAPHandler es que intenta implícitamente representar todo el mensaje XML en la memoria. Esto puede conducir a un gran uso de memoria. Varias implementaciones de JAX-WS han agregado sus propias soluciones para esto. Si trabaja con solicitudes grandes o respuestas grandes, entonces debe buscar uno de los enfoques propietarios.
Dado que usted pregunta sobre "el incluido en JDK 1.5 o superior", responderé con respecto a lo que se conoce formalmente como JAX-WS RI (también conocido como Metro), que es lo que se incluye con el JDK.
JAX-WS RI tiene una solución específica para esto que es muy eficiente en términos de uso de memoria.
Ver https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . Desafortunadamente, ese enlace ahora está roto, pero puedes encontrarlo en WayBack Machine. Daré los aspectos más destacados a continuación:
La gente de Metro en 2007 introdujo un tipo de controlador adicional MessageHandler<MessageHandlerContext>, que es propiedad de Metro. Es mucho más eficiente que SOAPHandler<SOAPMessageContext>ya que no intenta hacer una representación DOM en memoria.
Aquí está el texto crucial del artículo original del blog:
MessageHandler:
Utilizando el marco de controlador extensible proporcionado por la especificación JAX-WS y la mejor abstracción de mensajes en RI, presentamos un nuevo controlador llamadoMessageHandler para extender sus aplicaciones de servicio web. MessageHandler es similar a SOAPHandler, excepto que sus implementaciones tienen acceso aMessageHandlerContext(una extensión de MessageContext). A través de MessageHandlerContext se puede acceder al Mensaje y procesarlo usando la API de mensajes. Como puse en el título del blog, este controlador le permite trabajar en Message, que proporciona formas eficientes de acceder / procesar el mensaje, no solo un mensaje basado en DOM. El modelo de programación de los manejadores es el mismo y los manejadores de mensajes se pueden mezclar con manejadores lógicos y SOAP estándar. He agregado una muestra en JAX-WS RI 2.1.3 que muestra el uso de MessageHandler para registrar mensajes y aquí hay un fragmento de la muestra:
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;
}
}
(Cita final de la publicación del blog de 2007)
No hace falta decir que su controlador personalizado, LoggingHandleren el ejemplo, debe agregarse a su cadena de controlador para tener algún efecto. Esto es lo mismo que agregar cualquier otro Handler, por lo que puede buscar en las otras respuestas en esta página cómo hacerlo.
Puede encontrar un ejemplo completo en el repositorio de Metro GitHub .