2009-11-29 10 views
56

Sto giocando con JAX-RS, distribuendo su Tomcat. E 'fondamentalmente:Ottieni ServletContext nella risorsa JAX-RS

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

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

} 

C'è un modo per entrare in possesso del ServletContext nel mio risorse JAX-RS?

risposta

87

Inoltre, @Resource annotazione non potrebbe funzionare. Prova questo

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

L'iniezione non avviene fino a colpire il metodo del servizio

public class MyService { 
    @Context ServletContext context; 

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

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

quale classe javax.ws.rs devo usare come gestore di servlet? – leeeroy

+0

Non ti sto davvero prendendo da questo. Hai già una classe che gestisce le richieste HTTP GET. Si prega di elaborare più cosa significa per Servlet Handler. Saluti. –

+0

Un contenitore servlet necessita di un servlet per gestire le richieste. com.sun.ws.rest.spi.container.servlet.ServletContainer si occupa di gestire le richieste e di inviarle alle mie classi con annotazioni. Implica che non dovrei usare le classi com.sun. *, Quindi cosa dovrei usare? – leeeroy

5

Basta utilizzare l'iniezione di risorse come questo,

@Resource ServletContext servletContext; 
5

Come altri hanno notato, il ServletContext può essere iniettato al campo livello. 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ò permetterà di eseguire l'inizializzazione altro ServletContext disponibile.

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

+0

non dovrebbe essere setServletContext (contesto ServletContext di @Context) – Thomas

6

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

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

In primo luogo, include i <listener> e <context-param> tag 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 creare la classe del 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 possibile scegliere quale variabile statica assegnare al parametro letto. Ciò consente di leggere il parametro una volta all'avvio e riutilizzare più volte la variabile statica a cui lo si assegna.

+0

È anche possibile inserire 'context-param's in' conf/context.xml' in Apache Tomcat: http://stackoverflow.com/a/1626190/ 2639234 – KeksArmee