Adakah yang bisa menjelaskan kepada saya apa itu Penyedia JAX-RS dan apa yang dilakukan anotasi '@Provider'? Saya telah membaca dokumentasi tetapi saya tidak mendapatkannya.
Jika ada kelas sumber daya yang melayani permintaan masuk, apa yang dilakukan Penyedia? Bagaimana mereka berbeda dari kelas sumber daya tunggal ketika saya membuat kelas sumber daya persisten (yang bukan per-permintaan)? Atau apakah kelas-kelas itu juga penyedia?
110
Jawaban:
Penyedia adalah cara sederhana untuk memperluas dan menyesuaikan runtime JAX-RS. Anda dapat menganggapnya sebagai plugin yang (berpotensi) mengubah perilaku runtime, untuk mencapai serangkaian tujuan (ditentukan program).
Penyedia tidak sama dengan kelas sumber daya, mereka ada, secara konseptual, pada tingkat di antara kelas sumber daya dan implementasi JAX-RS. Jika membantu, Anda dapat menganggapnya sama seperti driver perangkat (ada di antara ruang pengguna dan kernel). Ini adalah generalisasi yang luas.
Ada tiga kelas penyedia yang ditentukan oleh spesifikasi JAX-RS saat ini. Kesamaan di antara keduanya adalah bahwa semua penyedia harus diidentifikasi dengan anotasi @Provider dan mengikuti aturan tertentu untuk deklarasi konstruktor. Selain itu, jenis penyedia yang berbeda mungkin memiliki anotasi tambahan, dan akan mengimplementasikan antarmuka yang berbeda.
Penyedia Entitas
Penyedia ini mengontrol pemetaan representasi data (seperti XML, JSON, CSV) ke objek Java mereka yang setara.
Penyedia Konteks
Penyedia ini mengontrol konteks yang dapat diakses resource melalui anotasi @Context.
Penyedia Pengecualian
Penyedia ini mengontrol pemetaan pengecualian Java ke instance Respons JAX-RS.
Runtime Anda akan datang dengan sejumlah penyedia yang telah ditentukan yang akan bertanggung jawab untuk menerapkan fungsionalitas tingkat dasar (misalnya untuk pemetaan ke dan dari XML, menerjemahkan pengecualian paling umum, dll). Anda juga dapat membuat penyedia Anda sendiri sesuai kebutuhan.
Spesifikasi JAX-RS adalah referensi yang baik untuk membaca tentang jenis penyedia yang berbeda ini dan apa yang dilakukannya (lihat Bab 4).
sumber
The @Provider penjelasan digunakan untuk sesuatu yang menarik bagi JAX-RS runtime , seperti MessageBodyReader dan MessageBodyWriter . Untuk permintaan HTTP, MessageBodyReader digunakan untuk memetakan badan entitas permintaan HTTP ke parameter metode. Di sisi respons, nilai yang dikembalikan dipetakan ke badan entitas respons HTTP dengan menggunakan MessageBodyWriter. Jika aplikasi perlu menyediakan metadata tambahan, seperti header HTTP atau kode status yang berbeda, metode dapat mengembalikan Respon yang membungkus entitas dan yang dapat dibangun menggunakan Respon. ResponseBuilder .
Anotasi @Provider memberi Anda kemampuan untuk memeriksa pesan masuk dan keluar pada tingkat XML mentah, dan dengan cara ini, Penyedia adalah mitra untuk Pengiriman di klien.
sumber
Untuk melakukan aktivitas tertentu seperti Filtering-Request / Response, Exception Handling, JAX-RS memiliki logika implementasi defaultnya sendiri. Namun, ini memungkinkan pengguna untuk menyediakan implementasi mereka sendiri juga.
Untuk menyediakan implementasi kita sendiri, kita perlu mengimplementasikan kelas yang sesuai dengan menetapkannya menggunakan anotasi @Provider.
JAX-RS akan melakukan pemindaian untuk menemukan keberadaan implementasi yang ditentukan pengguna tersebut dengan mencari anotasi @Provider.
Sebagai contoh:
sumber