Podemos chamar getServletContext () dentro do método contextinializado?
-
22-09-2019 - |
Pergunta
Criando servlet que implementa contextInitializer
interface neste código,
Em seguida, acessando o arquivo dentro contextinitialized()
usando esta linha
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
esta exceção ocorreu
java.lang.NullPointerException at
javax.servlet.GenericServlet.getServletContext(GenericServlet.java:160)
alguma ideia ?
Solução
o ServletContextListener#contextInitialized()
dá a você o ServletContextEvent
argumento que fornece a você o getServletContext()
método.
Assim, isso deve fazer:
public void contextInitialized(ServletContextEvent event) {
InputStream input = event.getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
// ...
}
Dito isto, você normalmente não quer que seu servlet implemente essa interface. O ouvinte tem um propósito diferente. Apenas substitua o HttpServlet#init()
do seguinte modo:
protected void init() throws ServletException {
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
// ...
}
Outras dicas
Não estou familiarizado com a interface contextinitializer a que você se refere, mas com base na exceção em que você está recebendo minha primeira reação é que não, você não pode chamar GetServletContext dentro do método contextinitializado. Se você conferir http://www.docjar.com/html/api/javax/servlet/genericServlet.java.html, você verá que, na linha 160, está tentando obter o contexto do ServletConfig e, aparentemente, o objeto ServletConfig para esse servlet ainda não foi inicializado.
Sua melhor aposta (na minha opinião) seria executar o código que você deseja executar em um ponto em que o ServletConfig e o ServletContext são inicializados - já que não estou familiarizado com o ambiente com o qual você está trabalhando (como eu disse , Não estou familiarizado com o Contextinitializer, então não sei de onde isso veio), não posso realmente deixar de ajudar o seu ciclo de vida de servlet.
Dependendo do que exatamente você está tentando fazer, considere ter seu fluxo de entrada como um campo estático. Dentro do seu método Doget/DoPost, você veria se ele foi inicializado - se for, ótimo, continue normalmente; E se não o fizer, inicialize -o conforme necessário. Seu contexto e configuração devem estar disponíveis no Doget/DoPost, então você deve estar pronto.