Java - getServletContext()。getAttribute()返回null

时间:2013-07-15 23:30:26

标签: java servlets

我有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>

现在我想从servlet类中获取此stockMap

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;
}

2 个答案:

答案 0 :(得分:6)

您错误地覆盖了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()称为

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

答案 1 :(得分:0)

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