Que signifie Provider dans JAX-RS?

110

Quelqu'un pourrait-il m'expliquer ce qu'est un fournisseur JAX-RS et ce que fait l'annotation «@Provider»? J'ai lu la documentation mais je ne peux pas l'obtenir.
S'il existe des classes de ressources qui traitent les demandes entrantes, que font les fournisseurs? En quoi sont-elles différentes des classes de ressources singleton lorsque je crée une classe de ressources persistantes (celle qui n'est pas par demande)? Ou ces classes sont-elles également des fournisseurs?

Artem Moskalev
la source
Pour aller avec ceci: Pourquoi le document JAX-RS n'explique-t-il pas cela dans le premier paragraphe du chapitre "Fournisseurs" - la page logiquement vers laquelle je me suis tourné en cherchant à comprendre. Documentation JAX-RS PDF
Jonathan Komar

Réponses:

138

Les fournisseurs sont simplement un moyen d'étendre et de personnaliser le runtime JAX-RS. Vous pouvez les considérer comme des plugins qui modifient (potentiellement) le comportement de l'exécution, afin d'accomplir un ensemble d'objectifs (définis par le programme).

Les fournisseurs ne sont pas les mêmes que les classes de ressources, ils existent, conceptuellement, à un niveau intermédiaire entre les classes de ressources et l'implémentation JAX-RS. Si cela aide, vous pouvez les considérer de la même manière que les pilotes de périphériques (existant entre l'espace utilisateur et l'espace noyau). Il s'agit d'une large généralisation.

Il existe trois classes de fournisseurs définies par la spécification JAX-RS actuelle. Le point commun entre eux est que tous les fournisseurs doivent être identifiés par l'annotation @Provider et suivre certaines règles pour la déclaration du constructeur. En dehors de cela, différents types de fournisseurs peuvent avoir des annotations supplémentaires et implémenteront différentes interfaces.


Fournisseurs d'entités

Ces fournisseurs contrôlent le mappage des représentations de données (comme XML, JSON, CSV) à leurs équivalents d'objet Java.

Fournisseurs de contexte

Ces fournisseurs contrôlent le contexte auquel les ressources peuvent accéder via les annotations @Context.

Fournisseurs d'exception

Ces fournisseurs contrôlent le mappage des exceptions Java vers une instance de réponse JAX-RS.


Votre environnement d'exécution viendra avec un certain nombre de fournisseurs prédéfinis qui seront responsables de l'implémentation d'un niveau de base de fonctionnalité (par exemple pour le mappage vers et depuis XML, la traduction des exceptions les plus courantes, etc.). Vous pouvez également créer vos propres fournisseurs selon vos besoins.

La spécification JAX-RS est une bonne référence pour lire sur ces différents types de fournisseurs et ce qu'ils font (voir chapitre 4).

la perception
la source
Merci. Je pense que j'ai eu l'idée de la chose =)
Artem Moskalev
Bien expliqué @Perception. Cela m'a vraiment aidé à comprendre.
L-Samuels
Bien expliqué. Une question cependant - en quoi les implémentations de @provider sont-elles différentes d'une implémentation de l'interface javax.ws.rs.core.Feature injectée via le paramètre init (jersey.config.server.provider.classnames) dans web.xml? Comment la commande est-elle contrôlée?
Andy Dufresne
Notez la dernière version de la spécification JAX-RS (Version 2.1 Final Release 13 juillet 2017) download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar
13

L' annotation @Provider est utilisée pour tout ce qui présente un intérêt pour l' environnement d'exécution JAX-RS , comme MessageBodyReader et MessageBodyWriter . Pour les requêtes HTTP, MessageBodyReader est utilisé pour mapper un corps d'entité de requête HTTP aux paramètres de méthode. Du côté de la réponse, une valeur de retour est mappée à un corps d'entité de réponse HTTP à l'aide d'un MessageBodyWriter. Si l'application doit fournir des métadonnées supplémentaires, telles que des en-têtes HTTP ou un code d'état différent, une méthode peut renvoyer une réponse qui encapsule l'entité et qui peut être générée à l'aide de Response. ResponseBuilder .

L' annotation @Provider vous donne la possibilité d'examiner les messages entrants et sortants au niveau XML brut, et de cette façon Provider est l'équivalent de Dispatch sur le client.

UN PATRON
la source
6

Pour effectuer certaines activités telles que le filtrage-demande / réponse, la gestion des exceptions, le JAX-RS a sa propre logique d'implémentation par défaut. Cependant, il permet également aux utilisateurs de fournir leur propre implémentation.

Pour fournir notre propre implémentation, nous devons implémenter les classes appropriées en les spécifiant avec l'annotation @Provider.

JAX-RS effectuera un cycle de balayage pour trouver l'existence d'une telle implémentation définie par l'utilisateur en recherchant l'annotation @Provider.

Par exemple:

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

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