2015-09-13 2 views
1

Я использую сервлеты не через некоторое время. И я получаю эту проблему, и я не могу ее закончить. Я использую 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 работу. Большое спасибо. стр. Я прочитаю все предложения и ответы и надеюсь, что вы сможете помочь мне в этой проблеме.

ответ

3

Инициализируйте свое поле в режиме override init(ServletConfig). ServletConfig не доступен при инициализации экземпляра.

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

Из javadoc of Servlet#init(ServletConfig)

Called контейнер сервлета, чтобы указать на сервлет, что сервлета размещаемый в эксплуатацию.

Контейнер сервлета вызывает метод init ровно один раз после экземпляр сервлета. Метод init должен завершиться успешно , прежде чем сервлет сможет получить любые запросы.

В javadoc of the GenericServlet implementation of init(ServletConfig) далее указывается

Эта реализация сохраняет ServletConfig объект он получает от контейнера сервлетов для последующего использования. При переопределении этой формы метода позвоните по номеру super.init(config).

+0

Hi. Большое спасибо! Это помогло мне! Могу я спросить вас что-то еще? Если у меня было много объектов службы, я должен переопределить метод init в каждом контроллере, где я должен использовать эти объекты, или я могу сделать эту инициализацию в одном месте? Спасибо. –

+1

@ davakin111 Вы можете создать суперкласс класса HttpServlet, который расширяет все ваши сервлеты. Если вы не хотите, чтобы все ваши сервлеты имели доступ ко всем службам, вам необходимо получить услуги по отдельности. Независимо от того, выполняете ли вы это в методе 'init' или внутри обработчиков doXyz, зависит от вас. –

+0

Спасибо :) Это был лучший ответ. –

Смежные вопросы