servlet restful jax example agregar tomcat servlets java-ee jax-rs application-variables

tomcat - restful - Obtenga ServletContext en el recurso JAX-RS



xml servlet java (5)

Estoy jugando con JAX-RS, implementando en Tomcat. Básicamente es:

@Path("/hello") @Produces({"text/plain"}) public class Hellohandler { @GET public String hello() { return "Hello World"; } }

¿Hay alguna manera de obtener el ServletContext dentro de mi recurso JAX-RS?


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

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

La inyección no ocurre hasta que llegue al 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


Como otros han notado, el servletContext se puede inyectar en el nivel de campo. 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á 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 de beans de java estándar para setters, void setXXX (Foo foo) y use la anotación @Context.



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.

Primero, incluya las etiquetas <listener> y <context-param> 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>

Ahora crea 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 qué 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.


Simplemente use inyección de recursos como esta,

@Resource ServletContext servletContext;