Obtener ServletContext en JAX-RS de recursos
-
06-07-2019 - |
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?
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;