D’où viennent les objects @Context

J’ai cherché partout, mais je n’arrive pas à trouver une réponse claire …

Quel est le mécanisme par lequel un serveur (glassfish pour mon problème) injecte des objects réels annotés avec @Context? Plus précisément, si je voulais écrire un cours qui fasse quelque chose comme:

@Path("/") public class MyResource { @GET public Ssortingng doSomething(@Context MyObject obj) { // ... } } 

alors comment pourrais-je le faire? Où est-ce que MyObject est instancié, qui le fait et comment?

Edit: J’ai vu des choses comme celle-ci:

Utilisation de @Context, @Provider et ContextResolver dans JAX-RS

http://jersey.576304.n2.nabble.com/ContextResolver-confusion-td5654154.html

Cependant, cela ne correspond pas à ce que j’ai vu, par exemple dans le constructeur de org.neo4j.server.rest.web.RestfulGraphDatabase, qui a la signature suivante:

 public RestfulGraphDatabase( @Context UriInfo uriInfo, @Context Database database, @Context InputFormat input, @Context OutputFormat output, @Context LeaseManager leaseManager ) 

Vous pouvez écrire votre propre fournisseur d’injection et le twigr sur Jersey – consultez SingletonTypeInjectableProvider et PerRequestTypeInjectableProvider – étendez l’ une de ces classes (en fonction du cycle de vie que vous souhaitez pour l’object injectable) et enregistrez votre implémentation en tant que fournisseur dans votre application Web.

Par exemple, quelque chose comme ceci:

 @Provider public class MyObjectProvider extends SingletonTypeInjectableProvider { public MyObjectProvider() { // binds MyObject.class to a single MyObject instance // ie the instance of MyObject created bellow will be injected if you use // @Context MyObject myObject super(MyObject.class, new MyObject()); } } 

Pour inclure le fournisseur dans votre application Web, vous avez plusieurs options:

  1. si votre application utilise l’parsing du chemin d’access aux classes (ou l’parsing des packages), assurez-vous simplement que le fournisseur se trouve dans le bon package / sur le chemin d’access aux classes.
  2. ou vous pouvez simplement l’enregistrer en utilisant l’entrée META-INF / services (ajoutez un fichier META-INF / services / com.sun.jersey.spi.inject.InjectableProvider ayant le nom de votre classe de fournisseur dans son contenu)

Je pense que je peux être sur quelque chose … et si cela fonctionne, Martin devrait obtenir un crédit partiel. 🙂

Il semble que la classe @Provider doit implémenter l’interface com.sun.jersey.spi.inject.Injectable . Cependant, je ne suis pas sûr que cela soit suffisant pour que le @Context soit réellement injecté. Ce qui manque, c’est que nous devons informer l’object ResourceConfig de l’application Web de @Provider. Dans le contexte de ce que j’essaie de faire, et en prenant des allusions de neo4j-server, le travail restant se résume à:

  • étendre com.sun.jersey.spi.container.servlet.ServletContainer et redéfinir la méthode configure:
 @Override protected void configure(WebConfig wc, ResourceConfig rc, WebApplication wa) { super.configure( wc, rc, wa ); Set singletons = rc.getSingletons(); singletons.add(new MyObjectProvider()); } 
  • en spécifiant que ce conteneur doit être utilisé dans le descripteur de déploiement web.xml:
  JAX-RS Servlet Container com.blah.MyServletContainer  

Je ne pense pas que vous puissiez utiliser @Context avec un type défini par l’utilisateur tel que MyObject . C’est pour les types d’injection que jax-ws comprend déjà. C’est mentionné ici .

Le chapitre 5 de la spécification JAX-RS présente tous les types Java JAX-RS standard pouvant être utilisés avec @Context.

Vous voudrez probablement utiliser quelque chose comme @FormParam ou @PathParam . Voir la section 2.3 de la spécification pour une description. Voici votre réponse, copiée à partir de cette section de la spécification:

En général, le type de paramètre Java de la méthode peut:

  1. Être un type primitif;
  2. Avoir un constructeur qui accepte un seul argument Ssortingng.
  3. Avoir une méthode statique nommée valueOf ou fromSsortingng qui accepte un seul argument Ssortingng (voir, par exemple, Integer.valueOf (Ssortingng) et java.util.UUID.fromSsortingng (Ssortingng)); ou
  4. Be List, Set ou SortedSet, où T en satisfait 2 ou 3 ci-dessus. La collection résultante est en lecture seule.

Voir les chapitres 5 à 6 de la spécification JAX-RS . Cela devrait vous dire tout ce que vous devez savoir à ce sujet.