2015-05-26 86 views
0

Howdie do,JNDI在服務器初始化函數中拋出Servlet異常

我試圖將應用程序部署到我的新Tomcat託管服務。問題是我現在正在運行服務器初始化函數時得到一個Servlet異常。

下面的錯誤是:

26-May-2015 12:56:48.668 SEVERE [http-nio-12937-exec-2] org.apache.catalina.core.StandardWrapperValve.invoke Allocate exception for servlet Controller 
javax.servlet.ServletException 
    at controller.Controller.init(Controller.java:42) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1241) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1154) 
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:827) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:744) 

現在,這是我的web.xml文件中,設置了數據源:

<Resource name="jdbc/drkplaya_pkRater" auth="Container" 
      type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/drkplaya_pkRater" 
      username="drkplaya_pkRater" password="" initialSize="1" maxActive="30" maxIdle="30" 
      maxWait="15000" removeAbandoned="true" removeAbandonedTimeout="300" logAbandoned="true" 
      validationQuery="select now();" 
    /> 
    <servlet> 
    <description></description> 
    <display-name>Controller</display-name> 
    <servlet-name>Controller</servlet-name> 
    <servlet-class>controller.Controller</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Controller</servlet-name> 
    <url-pattern>/gallery</url-pattern> 
    </servlet-mapping> 

最後,這是我的初始化函數調用數據源:

public void init(ServletConfig config) throws ServletException { 
     try { 
      InitialContext initContext = new InitialContext(); 
      Context env = (Context) initContext.lookup("java:comp/env"); 

      ds = (DataSource) env.lookup("jdbc/drkplaya_pkRater"); 

     } catch (NamingException e) { 
      throw new ServletException(); 
     } 
    } 

現在,這是我的本地服務器上運行的100%,但在上傳,我收到異常清單當然d以上。

在我的init函數中是否存在導致此錯誤的錯誤?

編輯:有人指出,我吞下了NameException。修復後,我知道有以下錯誤:

message javax.naming.NameNotFoundException: Name [jdbc/drkplaya_pkRater] is not bound in this Context. Unable to find [jdbc]. 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

javax.servlet.ServletException: javax.naming.NameNotFoundException: Name [jdbc/drkplaya_pkRater] is not bound in this Context. Unable to find [jdbc]. 
    controller.Controller.init(Controller.java:42) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655) 
    org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523) 
    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:744) 
root cause 

javax.naming.NameNotFoundException: Name [jdbc/drkplaya_pkRater] is not bound in this Context. Unable to find [jdbc]. 
    org.apache.naming.NamingContext.lookup(NamingContext.java:818) 
    org.apache.naming.NamingContext.lookup(NamingContext.java:166) 
    controller.Controller.init(Controller.java:39) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655) 
    org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523) 
    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) 
+1

你爲什麼吞嚥可能包含根本原因線索的'NamingException'?絕對不要這樣做,例外。總是將它們包裝爲根本原因,就像這樣拋出新的ServletException(e);'。然後你會在堆棧跟蹤中看到一個「由...引起」,最底層的通常已經代表整個答案。您的問題標題也是誤導性的。 JNDI沒有這樣做。你自己做到了。 – BalusC

+0

我很欣賞答案,但是,這是我的第一個JNDI應用程序。我只是試圖找到我的錯誤的原因。 – Jimmy

回答

1

您的mysql服務器可能運行在不同於tomcat的主機上。您將本地主機置於您的資源配置中。請諮詢您的託管服務提供商什麼是您的數據庫服務器的主機。

+0

謝謝你的回覆。我已將Resource配置更新爲:url =「jdbc:mysql://mysql3000.mochahost.com:3306/drkplaya_pkRater」,因爲這是我從主機服務器獲得的主機。但是,仍然完全相同的錯誤 – Jimmy

1

運行良好的本地機器上,因爲這樣的:

url="jdbc:mysql://localhost:3306/drkplaya_pkRater" 
     username="drkplaya_pkRater" password="" 

但是當你的主機服務器上部署相同web.xml,該localhost是指特定的主機服務器。

所以,你有兩個選擇:

1)無論是確保有一個mysql服務器上host server與特定的用戶名在3306端口上運行。

(或)

2)更改url=username, password以配合mysql數據庫實例上該特定host server

+0

你好,謝謝你的回覆。問題是我已將連接字符串更改爲:url =「jdbc:mysql://mysql3000.mochahost.com:3306/drkplaya_pkRater」 ,因爲這是我從主機服務器獲得的主機。但是,仍然是完全相同的錯誤 – Jimmy

0

的問題是兩件事情

1)我沒有使用mysql-connector在我的Apache/lib目錄

2)我從來沒有設置我的context.xml文件,包括上下文爲此服務器應該連接。所以我增加了以下我的context.xml文件:

<Resource name="jdbc/drkplaya_pkRater" auth="Container" 
      type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://mysql3000.mochahost.com:3306/drkplaya_pkRater" 
      username="drkplaya_pkRater" password="" initialSize="1" maxActive="30" maxIdle="30" 
      maxWait="15000" removeAbandoned="true" removeAbandonedTimeout="300" logAbandoned="true" 
      validationQuery="select now();" 
    /> 

3)我不得不更新我的web.xml文件只引用context.xml文件中創建的資源:

<resource-ref> 
    <description>DB Connection</description> 
    <res-ref-name>jdbc/drkplaya_pkRater</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    </resource-ref> 

4)感謝BalusC指出我在init函數中吞下了異常。所以它已被更改爲:

public void init(ServletConfig config) throws ServletException { 
     try { 
      InitialContext initContext = new InitialContext(); 
      Context env = (Context) initContext.lookup("java:comp/env"); 

      ds = (DataSource) env.lookup("jdbc/drkplaya_pkRater"); 

     } catch (NamingException e) { 
      throw new ServletException(e); 
     } 
    } 

我現在已成功連接到數據源。

再次感謝

相關問題