tutorial restful example rest resources jersey servlets

tutorial - restful api example java



Jersey/Servlet Contexto y carga de recursos al inicio (2)

No estoy familiarizado con Jersey, pero generalmente en una aplicación web Java, creo que lo correcto sería crear un ContextListener.

Un oyente de contexto es una clase que implementa la interfaz javax.servlet.ServletContextListener y está configurada 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 algo de inicialización por única vez y limpiar cosas antes la aplicación está detenida

Entonces los pasos son:

  1. crea tu clase Listener, implementa 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. Configura tu Listener en tu web.xml

Encontrarás información adicional aquí: tutorial

O en Sun''s, 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ás mejor con algo como:

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

Soy algo nuevo en el desarrollo web con Java. Estoy desarrollando un servicio web y he elegido REST / Jersey para ello.

Quiero iniciar algunas cosas al inicio del servicio y mantenerlas a lo largo de la vida del servicio.

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

Básicamente, lo que quiero hacer es cargar un archivo config.ini ubicado en mi directorio WEB-INF. Siguiendo esta ayuda , entiendo que necesito un ServletContext para cargar mi archivo como recurso.

Sin embargo, no tengo claro cómo obtener este ServletContext en un Servlet de Jersey , ya que no es realmente una instancia de un servlet, sino más bien un POJO con algunas anotaciones. Quería probar esta sugerencia , 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 hacer esto?

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

Cualquier ayuda sería muy apreciada. Gracias por adelantado,

Raphael


Usar un ContextListener no es la forma de JAX-RS para hacer esto: el ContextListener es el "siguiente nivel de capa", por así decirlo, en la API de servlet.

Puede poner la declaración anotada en los parámetros del constructor y se pasará al constructor:

public Servlet(@Context ServletContext context) {

Al usar la anotación @Context para un miembro de datos, se inicializa ese miembro una vez que se construye el objeto, como descubriste.

Otra forma de hacerlo es mover la inicialización del objeto Config en 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!

Iglesia