Apa yang dimaksud dengan Penyedia di JAX-RS?

110

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?

Artem Moskalev
sumber
Untuk mengikuti ini: Mengapa dokumen JAX-RS tidak menjelaskan hal ini di paragraf pertama dari bab "Penyedia" — halaman logis yang saya buka ketika mencari pemahaman. Dokumentasi JAX-RS PDF
Jonathan Komar

Jawaban:

138

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).

Persepsi
sumber
Terima kasih. Saya pikir saya mendapat ide tentang hal itu =)
Artem Moskalev
@Perception yang dijelaskan dengan baik. Ini sangat membantu pemahaman saya.
L-Samuels
Dijelaskan dengan baik. Namun satu pertanyaan - bagaimana implementasi @provider berbeda dari implementasi antarmuka javax.ws.rs.core.Feature yang dimasukkan melalui parameter init (jersey.config.server.provider.classnames) di web.xml? Bagaimana pesanan dikendalikan?
Andy Dufresne
Perhatikan versi terbaru dari spesifikasi JAX-RS (Versi 2.1 Rilis Akhir 13 Juli 2017) download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar
13

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.

SEORANG BOS
sumber
6

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:

...
@Provider
public class AppExceptionMapper implements ExceptionMapper<Throwable> {
...

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
maris
sumber