Я использую сервлеты не через некоторое время. И я получаю эту проблему, и я не могу ее закончить. Я использую Servlets для создания небольшого веб-проекта, и я попытался добавить объекты службы и DAO в ServletContext.Получение NPE при использовании getServletConfig(). GetServletContext(). GetAttribute() (Java)
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:
<?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 слушатель:
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, которой были добавлены в этих строках я получаю NPE:
private ClientService clientService = (ClientServiceImpl) getServletConfig().getServletContext().getAttribute("clientService");
Что я должен сделать, чтобы сделать эту NPE исключения ушла и мой clientService работу. Большое спасибо. стр. Я прочитаю все предложения и ответы и надеюсь, что вы сможете помочь мне в этой проблеме.
Hi. Большое спасибо! Это помогло мне! Могу я спросить вас что-то еще? Если у меня было много объектов службы, я должен переопределить метод init в каждом контроллере, где я должен использовать эти объекты, или я могу сделать эту инициализацию в одном месте? Спасибо. –
@ davakin111 Вы можете создать суперкласс класса HttpServlet, который расширяет все ваши сервлеты. Если вы не хотите, чтобы все ваши сервлеты имели доступ ко всем службам, вам необходимо получить услуги по отдельности. Независимо от того, выполняете ли вы это в методе 'init' или внутри обработчиков doXyz, зависит от вас. –
Спасибо :) Это был лучший ответ. –