Odpowiedzi wymienione tutaj, które prowadzą do użycia, SOAPHandler
są 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 MessageHandler
celu 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, LoggingHandler
w 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 .