Cosa significa Provider in JAX-RS?


110

Qualcuno potrebbe spiegarmi cos'è un provider JAX-RS e cosa fa l'annotazione "@Provider"? Ho letto la documentazione ma non riesco a ottenerla.
Se esistono classi di risorse che soddisfano le richieste in arrivo, cosa fanno i provider? In che modo sono diversi dalle classi di risorse singleton quando creo una classe di risorse persistente (quella che non è per richiesta)? O quelle classi sono anche fornitori?


Per andare avanti con questo: perché il documento JAX-RS non lo spiega nel primo paragrafo del capitolo "Provider", la pagina logica a cui mi sono rivolto quando cercavo comprensione. PDF documentazione JAX-RS
Jonathan Komar

Risposte:


138

I provider sono semplicemente un modo per estendere e personalizzare il runtime JAX-RS. Puoi pensarli come plugin che (potenzialmente) alterano il comportamento del runtime, al fine di raggiungere una serie di obiettivi (definiti dal programma).

I provider non sono la stessa cosa delle classi di risorse, esistono, concettualmente, a un livello intermedio tra le classi di risorse e l'implementazione JAX-RS. Se aiuta, puoi pensarli alla stessa luce dei driver di dispositivo (esistenti tra lo spazio utente e il kernel). Questa è un'ampia generalizzazione.

Esistono tre classi di provider definiti dalla specifica JAX-RS corrente. La cosa comune tra loro è che tutti i provider devono essere identificati dall'annotazione @Provider e seguire determinate regole per la dichiarazione del costruttore. Oltre a ciò, diversi tipi di provider possono avere annotazioni aggiuntive e implementeranno interfacce diverse.


Fornitori di entità

Questi fornitori controllano la mappatura delle rappresentazioni dei dati (come XML, JSON, CSV) ai loro equivalenti di oggetti Java.

Provider di contesto

Questi provider controllano il contesto a cui le risorse possono accedere tramite le annotazioni @Context.

Fornitori di eccezioni

Questi provider controllano la mappatura delle eccezioni Java a un'istanza di risposta JAX-RS.


Il tuo runtime verrà fornito con una serie di provider predefiniti che saranno responsabili dell'implementazione di un livello base di funzionalità (ad esempio per la mappatura da e verso XML, la traduzione delle eccezioni più comuni, ecc. Ecc.). È inoltre possibile creare i propri fornitori in base alle esigenze.

La specifica JAX-RS è un buon riferimento per leggere su questi diversi tipi di provider e cosa fanno (vedere il Capitolo 4).


Grazie. Penso di aver avuto l'idea della cosa =)
Artem Moskalev

Ben spiegato @Perception. Questo mi ha davvero aiutato a capire.
L-Samuels

Ben spiegato. Una domanda però: in che modo le implementazioni di @provider sono diverse da un'implementazione dell'interfaccia javax.ws.rs.core.Feature iniettata tramite il parametro init (jersey.config.server.provider.classnames) in web.xml? Come viene controllato l'ordine?
Andy Dufresne

Nota l'ultima versione della specifica JAX-RS (versione 2.1 versione finale del 13 luglio 2017) download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar

13

L' annotazione @Provider viene utilizzata per tutto ciò che è di interesse per il runtime JAX-RS , come MessageBodyReader e MessageBodyWriter . Per le richieste HTTP, MessageBodyReader viene utilizzato per mappare il corpo di un'entità della richiesta HTTP ai parametri del metodo. Sul lato della risposta, un valore restituito viene mappato a un corpo dell'entità di risposta HTTP utilizzando un MessageBodyWriter. Se l'applicazione deve fornire metadati aggiuntivi, come intestazioni HTTP o un codice di stato diverso, un metodo può restituire una risposta che avvolge l'entità e che può essere creata utilizzando Response. ResponseBuilder .

L' annotazione @Provider ti dà la possibilità di esaminare i messaggi in entrata e in uscita a livello XML non elaborato e in questo modo Provider è la controparte di Dispatch sul client.


6

Per eseguire determinate attività come Filtering-Request / Response, gestione delle eccezioni, JAX-RS ha una propria logica di implementazione predefinita. Tuttavia, consente agli utenti di fornire anche la propria implementazione.

Per fornire la nostra implementazione dobbiamo implementare le classi appropriate specificandole con l'annotazione @Provider.

JAX-RS farà un giro di scansione per trovare l'esistenza di qualsiasi implementazione definita dall'utente cercando l'annotazione @Provider.

Per esempio:

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

...
@Provider
@PreMatching
public class RESTRequestResponseFilter implements ContainerRequestFilter, ContainerResponseFilter {
...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.