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:
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
@Override protected void configure(WebConfig wc, ResourceConfig rc, WebApplication wa) { super.configure( wc, rc, wa ); Set
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:
- Être un type primitif;
- Avoir un constructeur qui accepte un seul argument Ssortingng.
- 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
- 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.