Ответы, приведенные здесь, которые помогут вам использовать SOAPHandler
, полностью верны. Преимущество такого подхода заключается в том, что он будет работать с любой реализацией JAX-WS, поскольку SOAPHandler является частью спецификации JAX-WS. Однако проблема с SOAPHandler заключается в том, что он неявно пытается представить все сообщение XML в памяти. Это может привести к огромному использованию памяти. Различные реализации JAX-WS добавили свои обходные пути для этого. Если вы работаете с большими запросами или большими ответами, то вам нужно рассмотреть один из проприетарных подходов.
Поскольку вы спрашиваете о том, "который включен в JDK 1.5 или лучше", я отвечу относительно того, что формально известно как JAX-WS RI (он же Metro), что входит в JDK.
JAX-WS RI имеет специальное решение для этого, которое очень эффективно с точки зрения использования памяти.
См. https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri. К сожалению, эта ссылка теперь не работает, но вы можете найти ее на WayBack Machine. Я дам основные моменты ниже:
Сотрудники Metro еще в 2007 году представили дополнительный тип обработчика, MessageHandler<MessageHandlerContext>
, который является собственностью Metro. Это намного эффективнее, чем SOAPHandler<SOAPMessageContext>
, так как он не пытается сделать представление DOM в памяти.
Вот ключевой текст из оригинальной статьи в блоге:
MessageHandler:
Использование расширяемой среды обработчика, предоставляемой JAX-WS
Спецификация и лучшая абстракция сообщений в RI мы представили
новый обработчик с именем MessageHandler
для расширения вашего веб-сервиса
Приложения. MessageHandler похож на SOAPHandler, за исключением того, что
реализации его получает доступ к MessageHandlerContext
(
расширение MessageContext). Через MessageHandlerContext можно
получить доступ к сообщению и обработать его с помощью API сообщения. Как я положил в
заголовок блога, этот обработчик позволяет вам работать с сообщением, которое
обеспечивает эффективные способы доступа / обработки сообщения, а не только DOM
основанное сообщение. Модель программирования обработчиков одинакова и
Обработчики сообщений могут быть смешаны со стандартными обработчиками логики и SOAP.
Я добавил образец в JAX-WS RI 2.1.3, показывающий использование
MessageHandler для регистрации сообщений и вот фрагмент из примера:
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;
}
}
(конец цитаты из сообщения в блоге 2007 года)
Нет необходимости говорить, что ваш пользовательский обработчик, LoggingHandler
в примере, должен быть добавлен в вашу цепочку обработчиков, чтобы иметь какой-либо эффект. Это то же самое, что и добавление любых других Handler
, поэтому вы можете посмотреть в других ответах на этой странице, как это сделать.
Вы можете найти полный пример в репозитории Metro GitHub .