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, LoggingHandler
en 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 .