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?
110
Réponses:
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 source
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.
la source
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:
la source