使用getServletConfig()时获取NPE .getServletContext()。getAttribute()(Java)

我很长一段时间都在使用Servlets。 而我正在解决这个问题,我无法终止自己。 我正在使用Servlets创建一个小型Web项目,我尝试将我的Service和DAO对象添加到ServletContext。

HTTP Status 500 - Error instantiating servlet class com.taxi.service.controller.LoginController type Exception report message Error instantiating servlet class com.taxi.service.controller.LoginController description The server encountered an internal error that prevented it from fulfilling this request. exception javax.servlet.ServletException: Error instantiating servlet class com.taxi.service.controller.LoginController org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:745) root cause java.lang.NullPointerException javax.servlet.GenericServlet.getServletContext(GenericServlet.java:123) com.taxi.service.controller.LoginController.(LoginController.java:16) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:526) java.lang.Class.newInstance(Class.java:379) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:745) 

我的web.xml文件:

   Jean taxi-service  com.taxi.service.utils.ApplicationContext   InitController com.taxi.service.controller.InitController   LoginController com.taxi.service.controller.LoginController   RegistrationController com.taxi.service.controller.RegistrationController   PrivateAreaController com.taxi.service.controller.PrivateAreaController   OrderController com.taxi.service.controller.OrderController   ReviewController com.taxi.service.controller.OrderController   AdminController com.taxi.service.controller.AdminController   InitController /   LoginController /login   RegistrationController /registration   OrderController /orderCreation   ReviewController /review   PrivateAreaController /privateArea   AdminController /adminPanel  <!--  /WEB-INF/pages/error.jsp  -->  45   DB Connection jdbc/order_board javax.sql.DataSource Container   /index.jsp   BASIC   

ServletContext监听器类:

 public class ApplicationContext implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { servletContextEvent.getServletContext().setAttribute("clientDao", new ClientDaoImpl(DataBaseUtil.getConnectionPoolInstance())); servletContextEvent.getServletContext().setAttribute("orderDao", new ClientDaoImpl(DataBaseUtil.getConnectionPoolInstance())); servletContextEvent.getServletContext().setAttribute("clientService", new ClientServiceImpl()); servletContextEvent.getServletContext().setAttribute("orderService", new OrderServiceImpl()); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } } 

登录控制器类:

 public class LoginController extends HttpServlet { private ClientService clientService = (ClientServiceImpl) getServletConfig().getServletContext().getAttribute("clientService"); @Override public void doGet(HttpServletRequest request, HttpServletResponse response){ ... } @Override public void doPost(HttpServletRequest request, HttpServletResponse response{ /** *...something doing with clientService */ } } 

当我试图从ServletContext中获取我的Service对象时,在这些行中我得到了NPE:

 private ClientService clientService = (ClientServiceImpl) getServletConfig().getServletContext().getAttribute("clientService"); 

我应该怎么做,使这个npeexception消失,我的clientService工作。 非常感谢。 ps我将阅读​​所有的建议和asnwers,并希望你能帮助我解决这个问题。

在重写init(ServletConfig)方法中初始化您的字段。 ServletConfig在实例初始化时不可用。

 @Override public void init(ServletConfig config) throws ServletException { super.init(config); this.clientService = config.getServletContext().getAttribute("clientService"); } 

来自Servlet#init(ServletConfig)

由servlet容器调用,以向servlet指示servlet正在投入使用。

在实例化servlet之后,servlet容器只调用一次init方法。 在servlet可以接收任何请求之前, init方法必须成功完成。

init(ServletConfig)GenericServlet实现的javadoc进一步指定

此实现存储从servlet容器接收的ServletConfig对象供以后使用。 覆盖此方法的forms时,请调用super.init(config)