1

我有一个MainServletContext存储implements ServletContextListener属性的

public void contextInitialized(ServletContextEvent sce) {

    ServletContext servletContext = sce.getServletContext();

    // successfully get a non-null stockMap
    servletContext.setAttribute("stockMap", stockMap);
}

我在其中声明了它web.xml,它看起来像

  <listener>
        <listener-class>controller.MainServletContext</listener-class>
  </listener>

现在我想stockMap从 servlet 类中取回它

Map<SimpleStock, Stock> stockMap = (Map<SimpleStock, Stock>) getServletContext().getAttribute("stockMap");

我有一个NullPointerException. 请问是不是少了一个步骤?

谢谢。

堆栈跟踪

java.lang.NullPointerException
javax.servlet.GenericServlet.getServletContext(GenericServlet.java:125)
controller.TopTenServlet.service(TopTenServlet.java:91)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

我的 Servlet 初始化方法

@Override
public void init(ServletConfig config) throws ServletException {
    this.servletConfig = config;
}
4

2 回答 2

7

init(ServletConfig)错误地覆盖了您的方法。它应该是

@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config); // would set: this.config = config;
    this.servletConfig = config;
}

这就是为什么建议覆盖init(ServletConfig)而是init()方便方法的原因,因为它可以防止您遇到完全相同的问题。

@Override
public void init() throws ServletException {
    this.servletConfig = config;
}

基类GenericServlet#init(ServletConfig)会调用你的init()as

@Override
public void init(ServletConfig config) throws ServletException {
    this.config = config;
    this.init();
}
于 2013-07-16T00:27:46.083 回答
0

我怀疑你有一个不调用 super(config) 的 servlet init(ServletConfig config) 方法。

于 2013-07-15T23:48:22.890 回答