Ottieni ServletContext nella risorsa JAX-RS
-
06-07-2019 - |
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?
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;