web-dev-qa-db-fra.com

Quels objets puis-je injecter à l'aide de l'annotation @Context?

Je suis nouveau sur JAX-RS et j'essaie de comprendre comment le @Context l'annotation est censée fonctionner.

Au javadoc il y a une liste de six classes (Application, UriInfo, Request, HttpHeaders, SecurityContext, Providers). Cependant, je trouve du code sur le Web qui utilise l'annotation this avec d'autres types, par exemple:

@GET
public String something(@Context HttpServletRequest req) {

}

Existe-t-il une liste des types pris en charge pouvant être utilisés avec ces annotations? Cette liste change-t-elle entre la mise en œuvre de la norme?

J'expérimente actuellement avec Jersey et je crains d'écrire du code qui ne peut pas être porté sur une autre implémentation JAX-RS.

25
idrosid

Le rivetage JAX-RS spécification définit tous les types standard que vous pouvez injecter via @Context.

Mais si j'étais vous, je consulterais simplement la documentation spécifique de votre fournisseur choisi pour voir ce qui est disponible.

Par exemple, RESTEasy fournit ces valeurs via @Context. Pendant ce temps, Jersey fournit ces . De toute évidence, il y aura chevauchement en raison des valeurs de contexte standard.

19
Vidya

Le @Context l'annotation vous permet d'injecter des détails de contexte de demande/réponse dans le fournisseur JAX-RS et les classes de ressources. L'injection peut être effectuée dans un champ classe, une propriété bean ou un paramètre de méthode .


La liste suivante récapitule tous les types pouvant être injectés à l'aide de @Context annotation, selon la spécification JAX-RS 2. :

À l'exception de Configuration et Providers , qui sont injectables dans les fournisseurs côté client et côté serveur, tous les autres types sont serveur uniquement.

Les types suivants sont disponibles uniquement lorsque l'application est déployée dans un conteneur de servlet:

JAX-RS 2.1 a introduit d'autres types qui peuvent être injectés avec @Context :

Outre les types standard répertoriés ci-dessus, les implémentations JAX-RS, telles que Jersey , RESTEasy et Apache CXF , peuvent définir leurs propres types qui peuvent être injecté en utilisant @Context .


Vous trouverez ci-dessous une description rapide de chaque type de JAX-RS disponible pour l'injection:

  • Application: L'instance de la sous-classe Application fournie par l'application peut être injectée dans un champ ou une méthode de classe paramètre. L'accès à l'instance de sous-classe Application permet de centraliser les informations de configuration dans cette classe.

  • URI et modèles d'URI: UriInfo fournit à la fois des informations statiques et dynamiques, par demande, sur les composants d'un URI de requête.

  • En-têtes: HttpHeaders permet d'accéder aux informations d'en-tête de la demande sous forme de carte ou via des méthodes pratiques fortement typées. Les en-têtes de réponse peuvent être fournis à l'aide de la classe Response .

  • Négociation de contenu et conditions préalables: Les méthodes de Request permettent à un appelant de déterminer la meilleure variante de représentation correspondante et pour évaluer si l'état actuel de la ressource correspond à des conditions préalables dans la demande.

  • Contexte de sécurité: L'interface SecurityContext donne accès aux informations sur le contexte de sécurité de la requête en cours. Les méthodes de SecurityContext permettent d'accéder au principal utilisateur actuel, aux informations sur les rôles assumés par le demandeur, si la demande est arrivée sur un canal sécurisé et le schéma d'authentification utilisé.

  • Fournisseurs: L'interface Providers permet de rechercher des instances de fournisseur en fonction d'un ensemble de critères de recherche. Cette interface devrait principalement intéresser les auteurs de fournisseurs souhaitant utiliser les fonctionnalités d'autres fournisseurs. Il est injectable dans les fournisseurs de clients et de serveurs.

  • Contexte des ressources: L'interface ResourceContext permet d'accéder à l'instanciation et à l'initialisation des classes de ressources ou de sous-ressources par défaut portée par demande. Il peut être injecté pour aider à la création et à l'initialisation, ou simplement à l'initialisation, des instances créées par une application.

  • Configuration: Le client et le serveur d'exécution Configuration s sont disponibles pour l'injection dans les fournisseurs (client ou serveur) et les classes de ressources (serveur uniquement).

  • Événements SSE: SseEventSink représente la connexion entrante SSE et fournit méthodes pour envoyer des événements. Sse fournit des méthodes d'usine pour les événements et les diffuseurs.


Ce post écrit par Arjan Tijms suggère que les futures versions de JAX-RS peuvent avoir une intégration plus forte avec CDI. Donc @Context peut être déconseillé puis supprimé au profit de @Inject :

JAX-RS 2.2

Pour une raison quelconque, qui a été largement perdue dans le temps, JAX-RS utilise son propre système d'injection de dépendances basé sur @Context au lieu de CDI @Inject. Alors que JAX-RS a été mis à jour au dernier moment avant sa sortie initiale pour avoir un certain niveau de support pour CDI, le fait que les ressources JAX-RS ne sont pas des beans CDI a inutilement freiné la spécification et a causé de la confusion même depuis que JAX-RS était introduit dans EE 6 (2009).

Ce passage au CDI pourrait éventuellement se produire en 2 étapes; dans JAX-RS 2.2 tout ce qui peut maintenant être injecté par @Context devrait également être injectable à l'aide de @Inject et les ressources JAX-RS seraient des beans CDI par défaut (peut-être à moins qu'ils ne soient explicitement désactivés). En même temps @Context serait obsolète. Dans JAX-RS 3.0 @Context serait alors réellement supprimé.

42
cassiomolin

L'annotation @Context peut être utilisée pour injecter 12 objets. Voici un bref résumé de chacun d'eux

  • HttpHeaders - valeurs et paramètres d'en-tête HTTP
  • UriInfo - Paramètres de requête URI et variables de chemin
  • SecurityContext - Donne accès aux données liées à la sécurité pour la requête HTTP donnée
  • Demande - Permet le traitement de la demande de condition préalable
  • ServletConfig - Le ServletConfig
  • ServletContext - Le ServletContext
  • HttpServletRequest - L'instance HttpServletRequest pour la demande
  • HttpServletResponse - L'instance HttpServletResponse
  • Application, configuration et fournisseurs -> Fournir des informations sur l'application, la configuration et les fournisseurs JAX-RS
  • ResourceContext - Donne accès aux instances de classe de ressources

Toutes ces instances peuvent être injectées dans la méthode des ressources

@Path("/")
public class EndpointResource {

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Response getAllHttpHeaders(final @Context HttpHeaders httpHeaders){
      // Code here that uses httpHeaders
  }
}

ou comme champ:

@Path("/")
public class EndpointResource {

  private final @Context HttpHeaders httpHeaders;

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Response getAllHttpHeaders(){
      // Code here that uses httpHeaders
  }
}

Voici une série en cinq parties répondant à la question À quoi sert @Conext?

4
Alex Theedom