Тут наведені відповіді, які керують вами SOAPHandler
, цілком правильні. Перевага такого підходу полягає в тому, що він буде працювати з будь-якою реалізацією JAX-WS, оскільки SOAPHandler є частиною специфікації JAX-WS. Однак проблема з SOAPHandler полягає в тому, що він неявно намагається представити ціле повідомлення XML в пам'яті. Це може призвести до величезного використання пам'яті. Різні реалізації JAX-WS додали для цього власні обхідні шляхи. Якщо ви працюєте з великими запитами або великими відповідями, то вам потрібно вивчити один із фірмових підходів.
Оскільки ви запитуєте про "той, що включений у JDK 1.5 або краще", я відповім на те, що офіційно відоме як JAX-WS RI (він же "Метро"), що є тим, що входить до JDK.
JAX-WS RI має для цього специфічне рішення, яке є дуже ефективним з точки зору використання пам'яті.
Дивіться https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . На жаль, це посилання зараз розірвано, але його можна знайти на WayBack Machine. Я дам основні моменти нижче:
Люди метрополітену ще в 2007 році представили додатковий тип обробника MessageHandler<MessageHandlerContext>
, який є власником Metro. Це набагато ефективніше, ніж SOAPHandler<SOAPMessageContext>
воно не намагається зробити представлення DOM в пам'яті.
Ось вирішальний текст з оригінальної статті блогу:
MessageHandler:
Скориставшись розширюваною рамкою обробника, що надається специфікацією JAX-WS, та кращою абстракцією повідомлень у RI, ми представили новий обробник, покликаний MessageHandler
розширити ваші програми веб-служб. MessageHandler схожий на SOAPHandler, за винятком того, що його реалізації отримують доступMessageHandlerContext
(розширення MessageContext). Через MessageHandlerContext можна отримати доступ до Повідомлення та обробити його за допомогою API повідомлення. Як я зазначив у назві блогу, цей обробник дозволяє вам працювати над Message, який забезпечує ефективні способи доступу / обробки повідомлення не просто повідомлення на основі DOM. Модель програмування обробників однакова, і обробники повідомлень можна змішувати зі стандартними обробниками Logical та 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 .