在此代码中创建实现contextInitializer
接口的servlet,
然后使用此行访问contextinitialized()
内的文件
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
发生此异常
java.lang.NullPointerException at
javax.servlet.GenericServlet.getServletContext(GenericServlet.java:160)
任何想法?
答案 0 :(得分: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中可用,所以你应该好好去。
答案 1 :(得分:1)
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"));
// ...
}