使用getServletConfig()时获取NPE .getServletContext()。getAttribute()(Java) [英] Getting NPE when using getServletConfig().getServletContext().getAttribute() (Java)
问题描述
我使用的Servlet不是很长时间。而我正在解决这个问题,我无法终止自己。我正在使用Servlets创建一个小型Web项目,我尝试将我的Service和DAO对象添加到ServletContext。
I am using Servlets from not a long time. And i am getting this problem, which i can't terminate myself. I am using Servlets to create a small web project, and i tried to add my Service and DAO objects to 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.<init>(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文件:
My web.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Jean taxi-service</display-name>
<listener>
<listener-class>com.taxi.service.utils.ApplicationContext</listener-class>
</listener>
<servlet>
<servlet-name>InitController</servlet-name>
<servlet-class>com.taxi.service.controller.InitController</servlet-class>
</servlet>
<servlet>
<servlet-name>LoginController</servlet-name>
<servlet-class>com.taxi.service.controller.LoginController</servlet-class>
</servlet>
<servlet>
<servlet-name>RegistrationController</servlet-name>
<servlet-class>com.taxi.service.controller.RegistrationController</servlet-class>
</servlet>
<servlet>
<servlet-name>PrivateAreaController</servlet-name>
<servlet-class>com.taxi.service.controller.PrivateAreaController</servlet-class>
</servlet>
<servlet>
<servlet-name>OrderController</servlet-name>
<servlet-class>com.taxi.service.controller.OrderController</servlet-class>
</servlet>
<servlet>
<servlet-name>ReviewController</servlet-name>
<servlet-class>com.taxi.service.controller.OrderController</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminController</servlet-name>
<servlet-class>com.taxi.service.controller.AdminController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>InitController</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LoginController</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>RegistrationController</servlet-name>
<url-pattern>/registration</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>OrderController</servlet-name>
<url-pattern>/orderCreation</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ReviewController</servlet-name>
<url-pattern>/review</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>PrivateAreaController</servlet-name>
<url-pattern>/privateArea</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminController</servlet-name>
<url-pattern>/adminPanel</url-pattern>
</servlet-mapping>
<!-- <error-page>
<location>/WEB-INF/pages/error.jsp</location>
</error-page>
-->
<session-config>
<session-timeout>45</session-timeout>
</session-config>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/order_board</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
</web-app>
ServletContext监听器类:
ServletContext listener class:
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:
When i am trying to get my Service object from ServletContext, which a were added, in these line i am getting NPE:
private ClientService clientService = (ClientServiceImpl) getServletConfig().getServletContext().getAttribute("clientService");
我该怎么办,让这个npe异常消失,我的clientService工作。
非常感谢。
ps我会阅读所有的建议和答案,希望你能帮我解决这个问题。
What should i do, to make this npe exception gone and my clientService work. Thanks a lot. p.s. I will read all the proposes and asnwers, and hope you can help me in this problem.
推荐答案
初始化你的覆盖 init(ServletConfig)中的字段
方法。实例初始化时, ServletConfig
不可用。
Initialize your field in an overriden init(ServletConfig)
method. The ServletConfig
is not available at instance initialization time.
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
this.clientService = config.getServletContext().getAttribute("clientService");
}
来自 javadoc Servlet #init(ServletConfig)
由servlet容器调用,以向servlet指示
servlet正在投入使用。
Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
在
实例化servlet之后,servlet容器只调用一次 init
方法。在$ servlet接收任何请求之前, init
方法必须成功完成
。
The servlet container calls the init
method exactly once after
instantiating the servlet. The init
method must complete successfully
before the servlet can receive any requests.
javadoc GenericServlet
的实现 init(ServletConfig)
进一步指定
The javadoc of the GenericServlet
implementation of init(ServletConfig)
further specifies
此实现存储从
接收的ServletConfig
对象,供以后使用。覆盖此形式的
方法时,请调用super.init(config)
。
This implementation stores the
ServletConfig
object it receives from the servlet container for later use. When overriding this form of the method, callsuper.init(config)
.
这篇关于使用getServletConfig()时获取NPE .getServletContext()。getAttribute()(Java)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!