Pregunta

Estoy jugando con JAX-RS, la implementación en Tomcat.Se trata básicamente de:

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

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

}

Hay alguna manera de que me puede conseguir el asimiento de la ServletContext dentro de mi JAX-RS de recursos?

¿Fue útil?

Solución

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

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

La inyección no se realiza hasta que se presiona 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

Otros consejos

Como otros han notado, el servletContext se puede inyectar a nivel de campo. También se puede inyectar a 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á realizar una inicialización adicional con el servletContext disponible.

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

El contexto de servlet también está disponible a la hora de implementar el ServletContextListener.Esto facilita la carga de parámetros tales como la cadena de conexión en el start-up.Usted puede definir la clase de escucha en web.xml que las cargas que ServletContextListener en el inicio de la aplicación web.

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

En primer lugar, incluir la <listener>y <context-param> etiquetas en el web.xml archivo:

<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>

Ahora hay que crear el contexto de servlet de la clase 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 qué variable estática para asignar el parámetro que han leído.Esto le permite leer el parámetro una vez en el inicio, y reutilizar muchas veces a través de la variable estática que asignar.

Simplemente use la inyección de recursos de esta manera,

@Resource ServletContext servletContext;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top