Domanda

Sto giocando con JAX-RS, distribuendo su Tomcat. Fondamentalmente:

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

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

}

Esiste un modo per ottenere ServletContext nella mia risorsa JAX-RS?

È stato utile?

Soluzione

Inoltre, @Resource l'annotazione potrebbe non funzionare. Prova questo

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

L'iniezione non avviene finché non si preme il metodo di servizio

public class MyService {
    @Context ServletContext context;

    public MyService() {
         print("Constructor " + context);  // null here     
    }

    @GET
    @Path("/thing") {               
             print("in  wizard service " + context); // available here

Altri suggerimenti

Come altri hanno notato, servletContext può essere iniettato a livello di campo. Può anche essere iniettato a livello di metodo:

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); 
    }
}

Ciò ti consentirà di eseguire un'inizializzazione aggiuntiva con servletContext disponibile.

Nota ovvia: non è necessario utilizzare il nome del metodo setServletContext . Puoi usare qualsiasi nome di metodo che desideri purché segua il modello di denominazione java bean standard per i setter, void setXXX (Foo foo) e usi l'annotazione @Context.

Il contesto servlet è disponibile anche quando si implementa ServletContextListener. Ciò semplifica il caricamento di parametri come la stringa di connessione all'avvio. Puoi definire la classe listener in web.xml che carica ServletContextListener all'avvio della tua applicazione web.

All'interno del file web.xml, aggiungi i tag <listener> e <context-param>. <=> specifica la classe che viene chiamata all'avvio. Il tag <=> definisce il parametro di contesto disponibile nell'applicazione Web.

Innanzitutto, includi i tag <=> e <=> nel file 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>

Ora crea la classe di contesto servlet come segue.

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
}

Ora puoi scegliere quale variabile statica assegnare il parametro che hai letto. Ciò consente di leggere il parametro una volta all'avvio e di riutilizzarlo più volte tramite la variabile statica a cui lo si assegna.

Usa solo l'iniezione di risorse in questo modo,

@Resource ServletContext servletContext;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top