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.
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.
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. :
javax.ws.rs.core.Application
javax.ws.rs.core.HttpHeaders
javax.ws.rs.core.Request
javax.ws.rs.core.SecurityContext
javax.ws.rs.core.UriInfo
javax.ws.rs.core.Configuration
javax.ws.rs.container.ResourceContext
javax.ws.rs.ext.Providers
À 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:
javax.servlet.HttpServletRequest
javax.servlet.HttpServletResponse
javax.servlet.ServletConfig
javax.servlet.ServletContext
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é.
L'annotation @Context peut être utilisée pour injecter 12 objets. Voici un bref résumé de chacun d'eux
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?