web-dev-qa-db-fra.com

Que signifie fournisseur dans JAX-RS?

Quelqu'un peut-il m'expliquer ce qu'est un fournisseur JAX-RS et en quoi consiste l'annotation "@Provider"? J'ai lu la documentation, mais je ne peux pas l'obtenir.
Si des classes de ressources 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 à la demande)? Ou ces classes sont-elles aussi des fournisseurs?

92
Artem Moskalev

Les fournisseurs constituent simplement un moyen d'étendre et de personnaliser le moteur d'exécution JAX-RS. Vous pouvez les considérer comme des plug-ins qui modifient (potentiellement) le comportement du moteur d'exécution, afin de réaliser un ensemble d'objectifs (définis par le programme).

Les fournisseurs sont pas identiques aux classes de ressources, ils existent, conceptuellement, à un niveau intermédiaire entre les classes de ressources et l'implémentation JAX-RS. Si cela vous aide, vous pouvez les considérer sous le même angle que les pilotes de périphérique (existant entre l'utilisateur et l'espace du noyau). C'est 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émenter différentes interfaces.


Fournisseurs d'entités

Ces fournisseurs contrôlent le mappage des représentations de données (telles que XML, JSON, CSV) sur leurs équivalents 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 sera fourni avec un certain nombre de fournisseurs prédéfinis qui seront responsables de la mise en œuvre d'un niveau de base de fonctionnalités (par exemple, pour le mappage vers et depuis XML, la traduction des exceptions les plus courantes, etc., etc.). Vous pouvez également créer vos propres fournisseurs selon vos besoins.

Le spécification JAX-RS est une bonne référence pour la lecture de ces différents types de fournisseurs et de ce qu'ils font (voir Chapitre 4).

117
Perception

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

@ Provider L'annotation vous permet d'examiner les messages entrants et sortants au niveau XML brut. De cette manière, Provider est l'équivalent de Dispatch sur le client.

9
A_BOSS

Pour effectuer certaines activités telles que demande de filtrage/réponse, gestion des exceptions, JAX-RS dispose de 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 une série d'analyses pour rechercher l'existence d'une telle implémentation définie par l'utilisateur en recherchant une annotation @Provider.

Par exemple:

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

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