Можем ли мы вызвать getServletContext () внутри метода contextInialized? - PullRequest
1 голос
/ 23 февраля 2010

Создание сервлета, который реализует интерфейс contextInitializer в этом коде,

затем доступ к файлу внутри contextinitialized() по этой строке

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

произошло это исключение

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

есть идеи?

Ответы [ 2 ]

1 голос
/ 23 февраля 2010

ServletContextListener#contextInitialized() дает вам аргумент ServletContextEvent, который предоставляет вам метод getServletContext().

Таким образом, это должно сделать:

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

Тем не менее, вы обычно не хотите, чтобы ваш сервлет реализовывал этот интерфейс. У слушателя другая цель. Просто переопределите HttpServlet#init() следующим образом:

protected void init() throws ServletException {
    InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
    // ...
}
1 голос
/ 23 февраля 2010

Я не знаком с интерфейсом ContextInitializer, на который вы ссылаетесь, но, исходя из исключения, вы получаете мою первую реакцию: нет, вы не можете вызвать getServletContext внутри метода contextInitialized. Если вы посмотрите http://www.docjar.com/html/api/javax/servlet/GenericServlet.java.html,, то увидите, что в строке 160 он пытается получить контекст из ServletConfig, и, очевидно, объект ServletConfig для этого сервлета еще не инициализирован.

Лучше всего (на мой взгляд) было бы выполнить код, который вы хотите запустить, в момент инициализации и ServletConfig, и ServletContext - поскольку я не знаю, в какой среде вы работаете ( как я уже сказал, я не знаком с ContextInitializer, поэтому я не знаю, откуда это взялось), я не могу помочь слишком сильно, насколько идет жизненный цикл вашего сервлета.

В зависимости от того, что именно вы пытаетесь сделать, вы можете рассмотреть возможность использования входного потока в качестве статического поля. Внутри вашего метода doGet / doPost вы бы проверили, инициализирован ли он - если он, то отлично, продолжает нормально; и если это не так, то инициализируйте его по мере необходимости. Ваш контекст и конфигурация должны быть доступны в doGet / doPost, так что вам будет хорошо.

...