Можем ли мы вызвать getServletContext() внутри контекстифицированного метода?

StackOverflow https://stackoverflow.com/questions/2320972

Вопрос

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

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

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

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

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

есть какие - нибудь идеи ?

Это было полезно?

Решение

Тот самый 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"));
    // ...
}

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top