2010-05-31 18 views
7

Soy algo nuevo en el desarrollo web con Java. Estoy desarrollando un servicio web y he elegido REST/Jersey para él.Jersey/ServletContext y carga de recursos en el inicio

Quiero iniciar algunas cosas en el inicio del servicio y mantenerlas a lo largo de la vida útil del servicio.

Primera pregunta: ¿Es el constructor del Jersey Servlet un buen lugar para hacerlo?

Básicamente, lo que quiero hacer es cargar un archivo config.ini ubicado en mi directorio WEB-INF. Después de this help, entiendo que necesito un ServletContext para cargar mi archivo como recurso.

Sin embargo, no está claro para mí cómo conseguir este ServletContext en un Jersey Servlet, ya que no es realmente una instancia de un servlet, sino más bien un POJO con algunas anotaciones. Quería probar this tip, pero el atributo "contexto" es nulo en el constructor. Creo que Jersey podría poblarlo después del constructor. Correcto ?

Entonces, ¿cómo es la forma correcta de hacerlo?

Aquí está mi código hasta ahora:

/** Main REST servlet */ 
@Path("/") 
public class Servlet { 

    // ---------------------------------------------------- 
    // Constants      
    // ---------------------------------------------------- 

    static private final String CONFIG_PATH = "/WEB-INF/config.ini"; 

    // ---------------------------------------------------- 
    // Attributes      
    // ---------------------------------------------------- 

    /** Context */ 
    @Context ServletContext context; 

    // ---------------------------------------------------- 
    // Constructor      
    // ---------------------------------------------------- 

    /** Init the servlet */ 
    public Servlet() { 

     // Load config.ini from WEB-INF 
     Config.config = new Config(
       this.context.getResourceAsStream(CONFIG_PATH)); 

     // FAIL! this.context is null ... 

    } 

    // ---------------------------------------------------- 
    // URI Handlers      
    // ---------------------------------------------------- 

    /** Welcome page */ 
    @GET 
    @Path("/") 
    @Produces(MediaType.TEXT_HTML) 
    public String welcome() { 
     return "<h1>Hi there.</h1>"; 
    } 
} 

sería muy apreciada Cualquier ayuda. Gracias de antemano,

Raphael

Respuesta

7

no estoy familiarizado con Jersey, pero por lo general en una aplicación web Java, creo que lo que hay que hacer sería crear un ContextListener.

Un detector de contexto es una clase que implementa la interfaz javax.servlet.ServletContextListener y se configura en su web.xml. Tiene un método que se ejecuta cuando la aplicación se carga por primera vez en su contenedor y otra que se ejecuta cuando se detiene la aplicación, por lo que es el lugar ideal para poner algunas cosas de inicialización por única vez y limpiar cosas antes la aplicación está detenida

Así que los pasos son:

  1. crear su clase Listener, poner en práctica el método contextInitialized (ServletContextEvent SCE). En este método, usted recibe un ServeltContextEvent que tiene el método getServletContext() que le da acceso al ServletContext.
  2. Configurar el oyente en su web.xml

Encontrará información adicional aquí: tutorial

O en Sun, er, el sitio de Oracle.

Por cierto, si su archivo estará en un archivo JAR, no estoy seguro de que el método ServletContext sea la mejor manera de cargarlo.Creo que está mejor con somethinbg como:

this.getClass().getClassLoader().getResourceAsStream("com.company.my.file.properties"); 
+0

Hola, gracias por su ayuda. Esto parece más claro de esta manera, ¡y esto funciona! –

+0

No estoy seguro de lo que hizo ya que esto no funciona: Jersey lo come y el código, como está escrito en el tutorial, nunca se llama bajo un servlet ReST de Jersey. –

8

El uso de un ContextListener no es la manera de JAX-RS para hacer esto- el ContextListener es la "capa de abajo", por así decirlo, en el servlet API.

Se puede retener la declaración anotada en los parámetros del constructor y que se ha pasado al constructor:

public Servlet(@Context ServletContext context) { 

Utilizando la anotación @Context de un miembro de datos inicializa ese miembro después de que el objeto se construye, como usted descubierto.

Otra forma de hacerlo es mover la inicialización del objeto Config a algún tipo de llamada init, y solo inicializarla cuando sea necesario, es decir, inicialización lenta. Entonces el miembro de datos ServletContext ya habrá sido establecido por el framework Jersey.

¡Buena suerte!

Kirk

+0

Puede declararlo como una propiedad de la clase en caso de que varios métodos necesiten recibir el mismo ... Se inyecta automáticamente, y es más fácil. ¡No es necesario pasarlo en el constructor! –

Cuestiones relacionadas