Ответы, перечисленные здесь, которые направляют вас использовать 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. Я дам основные моменты ниже:
В 2007 году сотрудники Metro представили дополнительный тип обработчиков MessageHandler<MessageHandlerContext>
, который является собственностью Metro. Это гораздо эффективнее, чем SOAPHandler<SOAPMessageContext>
попытка сделать представление DOM в памяти.
Вот ключевой текст из оригинальной статьи в блоге:
MessageHandler:
Используя расширяемую среду обработчика, предоставляемую спецификацией JAX-WS, и улучшенную абстракцию сообщений в RI, мы представили новый обработчик, призванный MessageHandler
расширять приложения веб-служб. MessageHandler похож на SOAPHandler, за исключением того, что его реализации получают доступ кMessageHandlerContext
(расширение MessageContext). Через MessageHandlerContext можно получить доступ к сообщению и обработать его с помощью API сообщения. Как я указал в заголовке блога, этот обработчик позволяет вам работать с Message, который предоставляет эффективные способы доступа / обработки сообщения, а не только сообщения на основе 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 .