Obtenir ServletContext dans une ressource JAX-RS
-
06-07-2019 - |
Question
Je joue avec JAX-RS, en déployant sur Tomcat. C'est fondamentalement:
@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {
@GET
public String hello() {
return "Hello World";
}
}
Puis-je obtenir le ServletContext
contenu de ma ressource JAX-RS?
La solution
De plus, @Resource
les annotations risquent de ne pas fonctionner. Essayez ceci
@javax.ws.rs.core.Context
ServletContext context;
L'injection ne se produit pas tant que vous n'avez pas activé la méthode de service
public class MyService {
@Context ServletContext context;
public MyService() {
print("Constructor " + context); // null here
}
@GET
@Path("/thing") {
print("in wizard service " + context); // available here
Autres conseils
Comme d'autres l'ont noté, le servletContext peut être injecté au niveau du champ. Il peut également être injecté au niveau de la méthode:
public static class MyService {
private ServletContext context;
private int minFoo;
public MyService() {
System.out.println("Constructor " + context); // null here
}
@Context
public void setServletContext(ServletContext context) {
System.out.println("servlet context set here");
this.context = context;
minFoo = Integer.parseInt(servletContext.getInitParameter("minFoo")).intValue();
}
@GET
@Path("/thing")
public void foo() {
System.out.println("in wizard service " + context); // available here
System.out.println("minFoo " + minFoo);
}
}
Cela vous permettra d'effectuer une initialisation supplémentaire avec le servletContext disponible.
Remarque évidente - vous ne devez pas utiliser le nom de méthode setServletContext . Vous pouvez utiliser n'importe quel nom de méthode tant que vous suivez le modèle de dénomination standard de bean java pour les setters, void setXXX (Foo foo) et utilisez l'annotation @Context.
Le contexte de servlet est également disponible lorsque vous implémentez ServletContextListener. Cela facilite le chargement de paramètres tels que la chaîne de connexion au démarrage. Vous pouvez définir la classe d’écoute dans le fichier web.xml qui charge ServletContextListener au démarrage de votre application Web.
Dans le fichier web.xml, ajoutez les balises <listener>
et <context-param>
. Le <=> spécifie la classe appelée au démarrage. La balise <=> définit le paramètre de contexte disponible dans votre application Web.
Commencez par inclure les balises <=> et <=> dans le fichier web.xml:
<web-app>
<!-- ... -->
<listener>
<listener-class>com.your.package.ServletContextClass</listener-class>
</listener>
<!-- Init parameters for db connection -->
<context-param>
<param-name>your_param</param-name>
<param-value>your_param_value</param-value>
</context-param>
<!-- ... -->
</web-app>
Créez maintenant la classe de contexte de servlet comme suit.
public class ServletContextClass implements ServletContextListener
{
public void contextInitialized(ServletContextEvent arg0)
{
//use the ServletContextEvent argument to access the
//parameter from the context-param
String my_param = arg0.getServletContext().getInitParameter("your_param");
}//end contextInitialized method
@Override
public void contextDestroyed(ServletContextEvent arg0)
{ }//end constextDestroyed method
}
Vous pouvez maintenant choisir quelle variable statique attribuer le paramètre que vous avez lu. Cela vous permet de lire le paramètre une fois au démarrage et de le réutiliser plusieurs fois via la variable statique à laquelle vous l'attribuez.
Utilisez simplement l'injection de ressources comme ceci,
@Resource ServletContext servletContext;
Découvrez: markmail.org/message/isy6mdpoh66vyi6k#query:jersey%20getservletcontext%20-spring+page:1+mid:sa7n465kfgdoskv5+state:results