web-dev-qa-db-fra.com

Obtenir ServletContext dans la ressource JAX-RS

Je joue avec JAX-RS, déployant sur Tomcat. C'est essentiellement:

@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {

    @GET
    public String hello() {
        return "Hello World";
    }

}

Existe-t-il un moyen de mettre la main sur le ServletContext dans ma ressource JAX-RS?

64
leeeroy

En outre, @Resource l'annotation peut ne pas fonctionner. Essaye ça

@javax.ws.rs.core.Context 
ServletContext context;

L'injection ne se produit que lorsque vous appuyez sur 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
96
Adeel Ansari

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 n'avez pas besoin d'utiliser le nom de la méthode setServletContext. Vous pouvez utiliser le nom de méthode de votre choix tant que vous suivez le standard Java modèle de dénomination du bean pour les setters, void setXXX (Foo foo) et utilisez l'annotation @Context.

8
JohnC

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'écouteur dans web.xml qui vous charge ServletContextListener au démarrage de votre application Web.

Dans le fichier web.xml, ajoutez le <listener>et <context-param> Mots clés. Le <listener> spécifie la classe qui est appelée au démarrage. Le <context-param> tag définit le paramètre de contexte disponible dans votre application Web.

Commencez par inclure le <listener>et <context-param> balises 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 la variable statique à affecter au 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 dans la variable statique à laquelle vous l'assignez.

6
Kobby Kan

Utilisez simplement l'injection de ressources comme ceci,

@Resource ServletContext servletContext;
5
ZZ Coder
0
idbill