Quelqu'un peut-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 comprends pas.
S'il existe des classes de ressources qui répondent aux demandes entrantes, que font les fournisseurs ? En quoi sont-ils différents des classes de ressources singleton lorsque je crée une classe de ressources persistante (celle qui n'est pas per-request) ? Ou bien ces classes sont-elles aussi des fournisseurs ?
Réponses
Trop de publicités?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 du runtime, afin d'atteindre un ensemble d'objectifs (définis par le programme).
Les fournisseurs sont no Les classes de ressources ne sont pas identiques aux classes de ressources, elles existent, conceptuellement, à un niveau intermédiaire entre les classes de ressources et l'implémentation de JAX-RS. Si cela peut vous aider, 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 généralisation générale.
Il existe trois classes de fournisseurs définies par la spécification actuelle de JAX-RS. 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 des constructeurs. En outre, les différents types de fournisseurs peuvent avoir des annotations supplémentaires et mettre en œuvre différentes interfaces.
Fournisseurs d'entités
Ces fournisseurs contrôlent le mappage des représentations de données (comme XML, JSON, CSV) vers leurs équivalents en objets Java.
Fournisseurs de contexte
Ces fournisseurs contrôlent le contexte auquel les ressources peuvent accéder via les annotations @Context.
Prestataires d'exception
Ces fournisseurs contrôlent le mappage des exceptions Java à une instance de réponse JAX-RS.
Votre moteur d'exécution sera livré avec un certain nombre de fournisseurs prédéfinis qui seront responsables de la mise en œuvre d'un niveau de fonctionnalité de base (par exemple, pour le mappage depuis et vers XML, la traduction des exceptions les plus courantes, etc.) Vous pouvez également créer vos propres fournisseurs selon vos besoins.
El Spécification de JAX-RS est une bonne référence pour se documenter sur ces différents types de fournisseurs et ce qu'ils font (voir le chapitre 4).
El @Provider L'annotation est utilisée pour tout ce qui présente un intérêt pour l'utilisateur. Runtime JAX-RS comme MessageBodyReader y MessageBodyWriter . Pour les demandes HTTP, le MessageBodyReader est utilisé pour faire correspondre le corps d'une entité de demande HTTP aux paramètres de la méthode. Du côté de la réponse, une valeur de retour est mise en correspondance avec 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 englobe l'entité et qui peut être construite en utilisant Response. ResponseBuilder .
@Provider vous donne la possibilité d'examiner les messages entrants et sortants au niveau du XML brut. De cette façon, Provider est l'équivalent de Dispatch sur le client.
Pour effectuer certaines activités telles que le filtrage des requêtes/réponses et la gestion des exceptions, JAX-RS possède sa propre logique d'implémentation par défaut. Cependant, il permet 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 tour 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 {
...