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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top