Java 我们可以在contextInialized方法中调用getServletContext()吗?

Java 我们可以在contextInialized方法中调用getServletContext()吗?,java,servlets,servletcontextlistener,Java,Servlets,Servletcontextlistener,在此代码中创建实现contextInitializer接口的servlet 然后使用此行访问contextinitialized()中的文件 InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties")); 发生了此异常 java.lang.NullPointerException at javax.servlet.GenericServlet.

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

然后使用此行访问
contextinitialized()
中的文件

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
发生了此异常

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

有什么想法吗?

我不熟悉您提到的ContextInitializer接口,但基于您遇到的异常情况,我的第一反应是不,您不能在contextInitialized方法内调用getServletContext。如果您签出,您将看到,在第160行,它试图从ServletConfig获取上下文,显然该servlet的ServletConfig对象尚未初始化

在我看来,您最好的选择是在ServletConfig和ServletContext都已初始化的情况下执行您想要运行的代码——因为我不熟悉您使用的环境(如我所说,我不熟悉ContextInitializer,所以我不知道它从何而来),就servlet生命周期而言,我真的帮不了你多少忙

取决于你想做什么,你可以考虑将输入流作为静态字段。在您的doGet/doPost方法中,您要检查它是否已经初始化——如果已经初始化,那么很好,继续正常工作;如果没有,则根据需要初始化它。您的上下文和配置应该在doGet/doPost中可用,因此您应该准备就绪。

提供了提供方法的参数

因此,这应该做到:

public void contextInitialized(ServletContextEvent event) {
    InputStream input = event.getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
    // ...
}
也就是说,您通常不希望servlet实现这个接口。听众有不同的目的。只需按如下方式覆盖该选项:

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