2009-11-29 11 views
56

Estoy jugando con JAX-RS, implementando en Tomcat. Se trata básicamente de:Obtenga ServletContext en el recurso JAX-RS

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

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

} 

¿Hay alguna manera de poder controlar la ServletContext dentro de mi recurso JAX-RS?

Respuesta

87

Además, @Resource anotación no podría funcionar. Prueba este

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

La inyección no se produce hasta que se pulsa el método de servicio

public class MyService { 
    @Context ServletContext context; 

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

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

qué clase javax.ws.rs uso como manejador de servlets? – leeeroy

+0

En realidad no te estoy entendiendo por esto. Ya tiene una clase que maneja las solicitudes HTTP GET. Por favor, elabore más lo que quiere decir con Servlet Handler. Aclamaciones. –

+0

Un contenedor de servlet necesita un servlet para manejar las solicitudes. com.sun.ws.rest.spi.container.servlet.ServletContainer se encarga de manejar las solicitudes y enviarlas a mis clases anotadas. Usted implica que no debería usar las clases com.sun. *, Entonces ¿qué debería usar? – leeeroy

5

sólo tiene que utilizar la inyección de recursos de este tipo,

@Resource ServletContext servletContext; 
5

Como otros han señalado, el ServletContext se puede inyectar en el campo nivel. También se puede inyectar en el nivel de método:

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

Esto le permitirá llevar a cabo la inicialización adicional con el ServletContext disponible.

Nota obvia: no tiene que utilizar el nombre del método setServletContext. Puede usar cualquier nombre de método que desee siempre y cuando siga el patrón de nomenclatura de beans de java estándar para setters, void setXXX (Foo foo) y use la anotación @Context.

+0

no debería ser setServletContext (@Context ServletContext context) – Thomas

6

El contexto de servlet también está disponible cuando implementa ServletContextListener. Esto facilita la carga de parámetros como la cadena de conexión en el arranque. Puede definir la clase de oyente en web.xml que le carga ServletContextListener al inicio de su aplicación web.

Dentro del archivo web.xml, agregue las etiquetas <listener> y <context-param>. El <listener> especifica la clase que se llama al inicio. La etiqueta <context-param> define el parámetro de contexto que está disponible en su aplicación web.

En primer lugar, incluye los <listener><context-param> y etiquetas en el archivo 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> 

crear ahora la clase de contexto de servlet de la siguiente manera.

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 
} 

Ahora puede elegir la variable estática para asignar el parámetro que ha leído. Esto le permite leer el parámetro una vez al inicio, y reutilizar muchas veces a través de la variable estática que le asigna.

+0

También es posible colocar el 'context-param's en' conf/context.xml' en Apache Tomcat: http://stackoverflow.com/a/1626190/ 2639234 – KeksArmee

Cuestiones relacionadas