3

在此代码中创建实现contextInitializer接口的 servlet,

然后contextinitialized()使用这一行访问里面的文件

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

发生了这个异常

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

有任何想法吗 ?

4

2 回答 2

3

ServletContextListener#contextInitialized()为您提供为您提供方法的ServletContextEvent论点getServletContext()

因此,这应该这样做:

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

也就是说,您通常不希望您的 servlet 实现此接口。听者有不同的目的。只需覆盖HttpServlet#init()如下:

protected void init() throws ServletException {
    InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
    // ...
}
于 2010-02-23T19:56:05.690 回答
1

我不熟悉您所指的 ContextInitializer 接口,但是基于您得到的异常,我的第一反应是不,您不能在 contextInitialized 方法中调用 getServletContext 。如果您查看http://www.docjar.com/html/api/javax/servlet/GenericServlet.java.html,您会看到,在第 160 行,它试图从 ServletConfig 中获取上下文,显然该 servlet 的 ServletConfig 对象尚未初始化。

你最好的选择(在我看来)是在初始化 ServletConfig 和 ServletContext 的地方执行你想要运行的代码——因为我不熟悉你正在使用的环境(就像我说的,我不熟悉 ContextInitializer,所以我不知道它是从哪里来的),就您的 servlet 生命周期而言,我真的无能为力。

根据您要执行的操作,您可以考虑将输入流作为静态字段。在您的 doGet/doPost 方法中,您将检查它是否已被初始化——如果已经初始化,那就太好了,照常进行;如果没有,则根据需要对其进行初始化。你的上下文和配置应该在 doGet/doPost 中可用,所以你应该很高兴。

于 2010-02-23T19:52:31.650 回答