Odpowiedzi wymienione tutaj, które prowadzą do użycia, SOAPHandlersą w pełni poprawne. Zaletą tego podejścia jest to, że będzie działać z każdą implementacją JAX-WS, ponieważ SOAPHandler jest częścią specyfikacji JAX-WS. Jednak problem z SOAPHandler polega na tym, że niejawnie próbuje przedstawić całą wiadomość XML w pamięci. Może to prowadzić do ogromnego zużycia pamięci. Różne implementacje JAX-WS dodały własne obejścia tego problemu. Jeśli pracujesz z dużymi żądaniami lub dużymi odpowiedziami, musisz przyjrzeć się jednemu z zastrzeżonych podejść.
Ponieważ pytasz o „ten zawarty w JDK 1.5 lub lepszy”, odpowiem w odniesieniu do tego, co jest formalnie znane jako JAX-WS RI (aka Metro), które jest zawarte w JDK.
JAX-WS RI ma na to specyficzne rozwiązanie, które jest bardzo wydajne pod względem wykorzystania pamięci.
Zobacz https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . Niestety ten link jest teraz uszkodzony, ale możesz go znaleźć w WayBack Machine. Poniżej podam najważniejsze informacje:
Ludzie z Metro w 2007 roku wprowadzili dodatkowy typ obsługi MessageHandler<MessageHandlerContext>, który jest własnością Metro. Jest o wiele bardziej wydajne niż SOAPHandler<SOAPMessageContext>to, że nie próbuje wykonywać reprezentacji DOM w pamięci.
Oto kluczowy tekst z oryginalnego artykułu na blogu:
MessageHandler:
Wykorzystując rozszerzalną strukturę Handler dostarczoną przez specyfikację JAX-WS Specification i lepszą abstrakcję komunikatów w RI, wprowadziliśmy nową procedurę obsługi wywoływaną w MessageHandlercelu rozszerzenia aplikacji Web Service. MessageHandler jest podobny do SOAPHandler, z wyjątkiem tego, że jego implementacje mają dostęp doMessageHandlerContext(rozszerzenie MessageContext). Poprzez MessageHandlerContext można uzyskać dostęp do Message i przetworzyć go za pomocą Message API. Jak umieściłem w tytule bloga, ten program obsługi pozwala ci pracować nad Message, który zapewnia efektywne sposoby dostępu / przetwarzania wiadomości, a nie tylko wiadomości opartej na DOM. Model programowania procedur obsługi jest taki sam, a programy obsługi komunikatów można mieszać ze standardowymi programami obsługi logicznej i SOAP. Dodałem przykład w JAX-WS RI 2.1.3 pokazujący użycie MessageHandler do rejestrowania komunikatów, a oto fragment z przykładu:
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;
}
}
(końcowy cytat z wpisu na blogu z 2007 roku)
Nie trzeba dodawać, że niestandardowy Handler, LoggingHandlerw tym przykładzie, musi zostać dodany do łańcucha Handler Chain, aby miał jakikolwiek efekt. To jest to samo, co dodawanie innych Handler, więc możesz zajrzeć do innych odpowiedzi na tej stronie, aby dowiedzieć się, jak to zrobić.
Możesz znaleźć pełny przykład w repozytorium Metro GitHub .