Java-getServlet上下文().getAttribute()返回null



我有一个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。我可以问一下是否少了一步吗?

谢谢。

Stacktrace

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

您错误地重写了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();
}

我怀疑您有一个servlet init(ServletConfig config)方法,它不调用super(config)。

最新更新