使用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)
。