Apakah ada cara mudah (alias: tidak menggunakan proxy) untuk mendapatkan akses ke permintaan mentah / respons XML untuk layanan web yang diterbitkan dengan implementasi referensi JAX-WS (yang termasuk dalam JDK 1.5 dan lebih baik)? Mampu melakukan itu melalui kode adalah apa yang perlu saya lakukan. Hanya dengan login ke file dengan konfigurasi logging yang cerdik akan lebih baik tetapi cukup.
Saya tahu bahwa ada kerangka kerja lain yang lebih kompleks dan lengkap yang mungkin melakukan itu, tetapi saya ingin membuatnya sesederhana mungkin dan sumbu, cxf, dll semua menambahkan overhead yang cukup besar yang ingin saya hindari.
Terima kasih!
java
web-services
jax-ws
Antonio
sumber
sumber
Jawaban:
Opsi berikut memungkinkan pencatatan semua komunikasi ke konsol (secara teknis, Anda hanya memerlukan satu di antaranya, tetapi itu tergantung pada pustaka yang Anda gunakan, jadi pengaturan keempat adalah pilihan yang lebih aman). Anda dapat mengaturnya dalam kode seperti pada contoh, atau sebagai parameter baris perintah menggunakan -D atau sebagai variabel lingkungan seperti yang ditulis Upendra.
Lihat pertanyaan Tracing permintaan XML / tanggapan dengan JAX-WS ketika kesalahan terjadi untuk detail.
sumber
Inilah solusi dalam kode mentah (disatukan berkat stjohnroe dan Shamik):
Di mana SOAPLoggingHandler berada (disobek dari contoh terkait):
sumber
ep.publish(publishURL);
: apa itupublishURL
(Dalam kode saya, url wsdl termasuk dalam layanan itu sendiri; saya tidak punya url di luar. Apa yang saya lewatkan?)Sebelum memulai kucing jantan, atur
JAVA_OPTS
seperti di bawah ini di Linux envs. Kemudian mulai Tomcat. Anda akan melihat permintaan dan respons dalamcatalina.out
file.sumber
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
Setel properti sistem berikut, ini akan mengaktifkan logging xml. Anda dapat mengaturnya di java atau file konfigurasi.
log konsol:
sumber
Suntikkan
SOAPHandler
ke antarmuka titik akhir. kita dapat melacak permintaan dan respons SOAPMenerapkan SOAPHandler dengan Programmatic
Deklaratif dengan menambahkan
@HandlerChain(file = "handlers.xml")
anotasi ke antarmuka titik akhir Anda.handlers.xml
SOAPLoggingHandler.java
sumber
Ada berbagai cara untuk melakukan ini secara terprogram, seperti dijelaskan dalam jawaban lain, tetapi mereka merupakan mekanisme yang cukup invasif. Namun, jika Anda tahu bahwa Anda menggunakan JAX-WS RI (alias "Metro"), maka Anda dapat melakukan ini di tingkat konfigurasi. Lihat di sini untuk instruksi tentang cara melakukan ini. Tidak perlu dipusingkan dengan aplikasi Anda.
sumber
// Solusi ini menyediakan cara menambahkan pemandu ke pemrograman web secara terprogram tanpa konfigurasi XML
// Lihat dokumen lengkap di sini: http://docs.oracle.com/cd/E17904_01//web.1111/e13734/handlers.htm#i222476
// Buat kelas baru yang mengimplementasikan SOAPHandler
// Secara sistematis tambahkan LogMessageHandler Anda
sumber
Saya memposting jawaban baru, karena saya tidak memiliki reputasi yang cukup untuk mengomentari jawaban yang diberikan oleh Antonio (lihat: https://stackoverflow.com/a/1957777 ).
Jika Anda ingin pesan SOAP dicetak dalam file (mis. Via Log4j), Anda dapat menggunakan:
Harap dicatat bahwa dalam keadaan tertentu, metode panggilan writeTo () mungkin tidak berperilaku seperti yang diharapkan (lihat: https://community.oracle.com/thread/1123104?tstart=0 atau https://www.java.net/node / 691073 ), oleh karena itu kode berikut akan melakukan trik:
sumber
Anda perlu menerapkan javax.xml.ws.handler.LogicalHandler, pawang ini kemudian perlu direferensikan dalam file konfigurasi handler, yang pada gilirannya dirujuk oleh anotasi @HandlerChain di titik akhir layanan Anda (antarmuka atau implementasi). Anda kemudian dapat menampilkan pesan melalui system.out atau logger dalam implementasi processMessage Anda.
Lihat
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/twbs_jaxwshandler.html
http://java.sun.com/mailers/techtips/enterprise/2006/TechTips_June06.html
sumber
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 daripadaSOAPHandler<SOAPMessageContext>
karena tidak mencoba melakukan representasi DOM dalam memori.Inilah teks penting dari artikel blog asli:
(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 lainHandler
, sehingga Anda dapat melihat jawaban lain di halaman ini untuk mengetahui cara melakukannya.Anda dapat menemukan contoh lengkap di repo Metro GitHub .
sumber
Anda dapat mencoba untuk meletakkan
ServletFilter
di depan layanan web dan memeriksa permintaan dan tanggapan pergi / kembali dari layanan.Meskipun Anda secara khusus tidak meminta proxy, terkadang saya menemukan tcptrace cukup untuk melihat apa yang terjadi pada koneksi. Ini alat yang sederhana, tanpa instal, itu menunjukkan aliran data dan dapat menulis ke file juga.
sumber
Dalam runtime Anda cukup menjalankan
sebagai dump adalah var publik yang didefinisikan di kelas sebagai berikut
sumber
apakah saya benar dalam memahami bahwa Anda ingin mengubah / mengakses pesan XML mentah?
Jika demikian, Anda (atau karena ini berusia lima tahun, lelaki berikutnya) mungkin ingin melihat antarmuka Penyedia yang merupakan bagian dari JAXWS. Mitra klien dilakukan menggunakan kelas "Pengiriman". Bagaimanapun, Anda tidak perlu menambahkan penangan atau pencegat. Anda masih BISA, tentu saja. Kelemahannya begini, Anda benar-benar bertanggung jawab untuk membangun SOAPMessage, tetapi mudah, dan jika itu yang Anda inginkan (seperti yang saya lakukan) ini sempurna.
Berikut adalah contoh untuk sisi server (agak canggung, itu hanya untuk bereksperimen) -
Anda menerbitkannya seperti Anda akan SEI,
Atau Anda bisa menggunakan kelas Endpoint untuk itu. Harapan yang telah membantu.
Dan oh, jika mau, Anda tidak perlu berurusan dengan tajuk dan barang, jika Anda mengubah mode layanan ke PAYLOAD (Anda hanya akan mendapatkan Soap Body).
sumber
dengan file konfigurasi logback.xml, Anda dapat melakukan:
Itu akan mencatat permintaan dan respons seperti ini (tergantung pada konfigurasi Anda untuk keluaran log):
sumber
Saya telah mencoba menemukan beberapa framework library untuk mencatat permintaan dan respons sabun layanan web selama beberapa hari. Kode di bawah ini memperbaiki masalah saya:
sumber
Salah satu cara untuk melakukannya adalah tidak menggunakan kode Anda tetapi menggunakan sniffer paket jaringan seperti Etheral atau WireShark yang dapat menangkap paket HTTP dengan pesan XML sebagai payload, dan Anda dapat terus mencatatnya ke file atau lebih.
Tetapi pendekatan yang lebih canggih adalah menulis penangan pesan Anda sendiri. Anda dapat melihatnya di sini .
sumber
Sebenarnya. Jika Anda melihat ke sumber HttpClientTransport Anda akan melihat bahwa itu juga menulis pesan ke java.util.logging.Logger. Yang berarti Anda juga dapat melihat pesan-pesan itu di log Anda.
Sebagai contoh jika Anda menggunakan Log4J2 yang perlu Anda lakukan adalah yang berikut:
Setelah langkah-langkah ini, Anda mulai melihat pesan SOAP di log Anda.
sumber
Ada beberapa jawaban menggunakan SoapHandlers di utas ini. Anda harus tahu bahwa SoapHandlers memodifikasi pesan jika
writeTo(out)
dipanggil.Memanggil
writeTo(out)
metode SOAPMessage secara otomatissaveChanges()
juga memanggil metode. Akibatnya semua data biner MTOM / XOP yang dilampirkan dalam pesan hilang.Saya tidak yakin mengapa ini terjadi, tetapi tampaknya fitur yang didokumentasikan.
https://docs.oracle.com/javase/7/docs/api/javax/xml/soap/SOAPMessage.html#saveChanges ()
sumber
Jika Anda menjalankan server aplikasi IBM Liberty, cukup tambahkan ibm-ws-bnd.xml ke direktori WEB-INF.
sumber