2017-06-02 8 views
-1

DBを扱うServlet Contextオブジェクトに挿入します。私の実装はServletContextListenerです。しかし、私は私のサーブレットを使用しようとするとHTTP Status [500] – [Internal Server Error]を取得します。なぜServletContextからのアップロードデータがサーブレットのロードを妨げていますか?

マイServletContextListener

@WebListener 
public class ContextListener implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 

     final ServletContext servletContext = servletContextEvent.getServletContext(); 

     servletContext.setAttribute("db", new DBJointHandler("database_scripts", "authentication_database")); 

    } 
    ... 
} 

そして、私のサーブレット:

public class AddUserServlet extends HttpServlet { 

    private DBJoint db = (DBJoint) getServletContext().getAttribute("db"); 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 

     db.somethingToDo(); 
     ... 
    } 
} 

とコールAddUserServletの時:

HTTP Status [500] – [Internal Server Error] 

Type Exception Report 

Message Error instantiating servlet class [ru.pravvich.servlets.AddUserServlet] 

Description The server encountered an unexpected condition that prevented it from fulfilling the request. 

Exception 

javax.servlet.ServletException: Error instantiating servlet class [ru.pravvich.servlets.AddUserServlet] 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) 
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) 
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) 
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    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) 
    ru.pravvich.servlets.AddUserServlet.<init>(AddUserServlet.java:18) 
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) 
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) 
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) 
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Thread.java:745) 

これは、呼び出しの時にのみ発生しますブラウザーフォームを介したサーブレット。私が(DBJoint) getServletContext().getAttribute("DB")サーブレットを問題なくクリーニングする場合。しかし、私はDBとの作業のためにこのオブジェクトが必要です...

なぜですか?どうしたの?どのようにこの問題を修正しますか?ありがとうございました。

答えて

1

サーブレットの構築中にServletContextが定義されていません。サーブレットが初期化されるまで

あなたがdbフィールドを初期化延期する必要があります。

public class AddUserServlet extends HttpServlet { 

    private DBJoint db; 

    @Override 
    void init(ServletConfig config) { 
     ServletContext servletContext = config.getServletContext(); 
     db = servletContext.getAttribute("db"); 
    } 

    ... 

} 
関連する問題