Pregunta

Creación de servlet que implementa la interfaz contextInitializer en este código,

a continuación, acceder a archivos dentro contextinitialized() usando esta línea

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));

Se ha producido esta excepción

java.lang.NullPointerException         at      
    javax.servlet.GenericServlet.getServletContext(GenericServlet.java:160)

alguna idea?

¿Fue útil?

Solución

La ServletContextListener#contextInitialized() le da la ServletContextEvent argumento que le proporciona la getServletContext() método.

Por lo tanto, esto debería hacer:

public void contextInitialized(ServletContextEvent event) {
    InputStream input = event.getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
    // ...
}

Una vez dicho esto, que normalmente no desea que el servlet para implementar esta interfaz. El oyente tiene un propósito diferente. Sólo anular el HttpServlet#init() como sigue:

protected void init() throws ServletException {
    InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
    // ...
}

Otros consejos

No estoy familiarizado con la interfaz de ContextInitializer que se refieren a, pero en base a la excepción de que está recibiendo mi primera reacción es que no, no se puede llamar getServletContext dentro del método contextInitialized. Si se echa un vistazo http://www.docjar.com/ html / api / javax / servlet / GenericServlet.java.html , verá que, en la línea 160, que está tratando de obtener el contexto de la ServletConfig, y al parecer el objeto ServletConfig para ese servlet no está inicializado sin embargo.

Lo mejor (en mi opinión) sería la de ejecutar el código que está queriendo correr en un punto donde tanto ServletConfig y ServletContext se inicializan - ya que no estoy familiarizado con lo que el medio ambiente se trabaja con ( como he dicho, no estoy familiarizado con ContextInitializer, así que no sé de donde vino), no puedo realmente ayuda mucho en cuanto a su ciclo de vida del servlet va.

En función de qué es exactamente lo que estamos tratando de hacer, se puede considerar que su flujo de entrada como un campo estático. Dentro de su método doGet / doPost, usted comprobar para ver si se ha inicializado - si es así, entonces bien, seguir como normal; y si no lo tiene, entonces inicializar si es necesario. Su contexto y de configuración debe estar disponible en doGet / doPost, por lo que debe ser bueno para ir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top