Domanda

La creazione di servlet che implementa l'interfaccia contextInitializer in questo codice,

quindi l'accesso ai file all'interno di contextinitialized() utilizzando questa linea

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

Si è verificato questa eccezione

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

tutte le idee?

È stato utile?

Soluzione

Il ServletContextListener#contextInitialized() ti da ServletContextEvent argomento che si fornisce il metodo getServletContext() .

Quindi, questo dovrebbe fare:

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

Detto questo, che normalmente non si desidera che il servlet per implementare questa interfaccia. L'ascoltatore ha uno scopo diverso. Basta ignorare il HttpServlet#init() come segue:

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

Altri suggerimenti

Non ho dimestichezza con l'interfaccia ContextInitializer si fa riferimento a, ma sulla base di eccezione che stai ricevendo la mia prima reazione è che no, non si può chiamare getServletContext all'interno del metodo contextInitialized. Se si estrae http://www.docjar.com/ html / api / javax / servlet / GenericServlet.java.html , vedrete che, alla riga 160, sta cercando di ottenere il contesto dal ServletConfig, ea quanto pare l'oggetto ServletConfig per quella servlet non è inizializzata ancora.

La cosa migliore (a mio parere) sarebbe quello di eseguire il codice hai intenzione di correre in un punto in cui vengono inizializzati sia ServletConfig e ServletContext - dal momento che non sono a conoscenza che ambiente si sta lavorando ( come ho detto, io non sono a conoscenza ContextInitializer, in modo da non so dove che è venuto da), non posso davvero aiutare anche molto per quanto riguarda il ciclo di vita del servlet va.

A seconda di cosa esattamente si sta cercando di fare, si può considerare avere il vostro flusso di input come un campo statico. Dentro il metodo doGet / doPost, si sarebbe controllare per vedere se è stata inizializzata - se ha, poi grande, portare avanti come al solito; e se non lo ha, poi inizializzare, se necessario. Il vostro contesto e di configurazione dovrebbe essere disponibile in doGet / doPost, così si dovrebbe essere a posto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top