Jawaban yang tercantum di sini yang memandu Anda untuk menggunakan SOAPHandler
sepenuhnya benar. Manfaat dari pendekatan itu adalah bahwa ia akan bekerja dengan implementasi JAX-WS, karena SOAPHandler adalah bagian dari spesifikasi JAX-WS. Namun, masalah dengan SOAPHandler adalah bahwa ia secara implisit berusaha untuk mewakili seluruh pesan XML dalam memori. Ini dapat menyebabkan penggunaan memori yang sangat besar. Berbagai implementasi JAX-WS telah menambahkan solusi mereka sendiri untuk ini. Jika Anda bekerja dengan permintaan besar atau respons besar, maka Anda perlu melihat ke salah satu pendekatan kepemilikan.
Karena Anda bertanya tentang "yang termasuk dalam JDK 1.5 atau lebih baik" saya akan menjawab sehubungan dengan apa yang secara resmi dikenal sebagai JAX-WS RI (alias Metro) yang merupakan apa yang disertakan dengan JDK.
JAX-WS RI memiliki solusi spesifik untuk ini yang sangat efisien dalam hal penggunaan memori.
Lihat https://javaee.github.io/metro/doc/user-guide/ch02.html#fficiency-handlers-in-jax-ws-ri . Sayangnya tautan itu sekarang rusak tetapi Anda dapat menemukannya di WayBack Machine. Saya akan memberikan highlight di bawah ini:
Orang-orang Metro pada tahun 2007 memperkenalkan jenis penangan tambahan MessageHandler<MessageHandlerContext>
, yang merupakan hak milik Metro. Ini jauh lebih efisien daripada SOAPHandler<SOAPMessageContext>
karena tidak mencoba melakukan representasi DOM dalam memori.
Inilah teks penting dari artikel blog asli:
MessageHandler:
Memanfaatkan kerangka Handler yang dapat diperluas yang disediakan oleh Spesifikasi JAX-WS dan abstraksi Pesan yang lebih baik di RI, kami memperkenalkan penangan baru yang disebutMessageHandler
untuk memperluas aplikasi Layanan Web Anda. MessageHandler mirip dengan SOAPHandler, kecuali bahwa implementasi itu mendapat aksesMessageHandlerContext
(ekstensi dari MessageContext). Melalui MessageHandlerContext, seseorang dapat mengakses Pesan dan memprosesnya menggunakan API Pesan. Saat saya memasukkan judul blog, pawang ini memungkinkan Anda mengerjakan Pesan, yang menyediakan cara-cara efisien untuk mengakses / memproses pesan bukan hanya pesan berbasis DOM. Model pemrograman dari penangan sama dan Penangan pesan dapat dicampur dengan penangan Logical dan SOAP standar. Saya telah menambahkan sampel di JAX-WS RI 2.1.3 yang menunjukkan penggunaan MessageHandler untuk mencatat pesan dan berikut adalah cuplikan dari sampel:
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;
}
}
(kutipan akhir dari posting blog 2007)
Tidak perlu dikatakan Handler kustom Anda, LoggingHandler
dalam contoh, perlu ditambahkan ke Handler Chain Anda untuk memiliki efek apa pun. Ini sama dengan menambahkan yang lain Handler
, sehingga Anda dapat melihat jawaban lain di halaman ini untuk mengetahui cara melakukannya.
Anda dapat menemukan contoh lengkap di repo Metro GitHub .