2016-04-26 150 views
0

我在这个网站上发现了很多关于解决问题的问题和解答,但找不到解决方案,因此我终于不得不再次发布这个相同的问题!javax.naming.NameNotFoundException | JNDI查找

我创建一个简单的servlet DBCPDataSourceExample,并得到来自DataSource性质,而我在的Apache Tomcat V8应用服务器的server.xml & context.xml提供了一个连接。

以下为DBCPDataSourceExample的servlet:

import javax.sql.DataSource; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class DBCPDataSourceExample extends HttpServlet { 

protected void doGet(HttpServletRequest request, HttpServletResponse respone) throws IOException { 
    Connection connection = null; 
    PreparedStatement statement = null; 
    ResultSet resultSet = null; 
    Context ctx ; 
    try { 
     try { 
      ctx = new InitialContext(); 
      Context ic= (Context) ctx.lookup("java:/comp/env"); 
      DataSource dts = (DataSource) ic.lookup("jdbc/harsh"); 
      connection = dts.getConnection(); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 
     statement = connection.prepareStatement("select * from stories"); 
     resultSet = statement.executeQuery(); 
     while (resultSet.next()) { 
      System.out.println("storyId: " + resultSet.getString("storyId")); 
      System.out.println("storyTitle: " + resultSet.getString("storyTitle")); 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } finally { 
     if (resultSet != null) try { resultSet.close(); } catch (SQLException e) {e.printStackTrace();} 
     if (statement != null) try { statement.close(); } catch (SQLException e) {e.printStackTrace();} 
     if (connection != null) try { connection.close(); } catch (SQLException e) {e.printStackTrace();} 
    } 

} 
} 

server.xmlResource映射:

<GlobalNamingResources> 
<!-- Editable user database that can also be used by 
    UserDatabaseRealm to authenticate users 
--> 
<Resource name="UserDatabase" auth="Container" 
      type="org.apache.catalina.UserDatabase" 
      description="User database that can be updated and saved" 
      factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
      pathname="conf/tomcat-users.xml" /> 

<Resource name="jdbc/MyDB" 
      global="jdbc/MyDB" 
      auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost/storyBoard" 
      username="root" 
      password="" 

      maxActive="100" 
      maxIdle="20" 
      minIdle="5" 
      maxWait="10000"/> 
</GlobalNamingResources> 

context.xmlResource映射:

<Resource name="jdbc/harsh" global="jdbc/MyDB" auth="container" type="javax.sql.DataSource" /> 

如果xml代码有问题,我无法辨认。请帮忙!

下面是从控制台堆栈跟踪:

javax.naming.NameNotFoundException: Name [jdbc/harsh] is not bound in this Context. Unable to find [jdbc]. 
at org.apache.naming.NamingContext.lookup(NamingContext.java:818) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:166) 
at com.dbcp.DBCPDataSourceExample.doGet(DBCPDataSourceExample.java:31) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) 
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Unknown Source) 

的代码行堆栈跟踪点是这样的:

   DataSource dts = (DataSource) ic.lookup("jdbc/harsh"); 
+0

添加完整的堆栈跟踪请 – Jens

+0

我hv增加了堆栈跟踪。请检查。 –

+0

是否尝试将“jdbc/harsh”更改为此“jdbc/MyDB” –

回答

1

我们的平均时间,我们需要增加资源,在server.xml中创建一个资源链接,它是context.xml的必要位置。

在我们的例子中,我们保持的context.xml在我们的战争的META-INF和样本项外观

<ResourceLink name="email.host.name" global="email.host.name" type="java.lang.String"/>

请验证您的context.xml条目。

还要确保你已经把mysql驱动放在tomcat的lib目录中。

+0

嗯,我没有把'context.xml'放在我的应用程序的META-INF文件夹中。现在的错误是: 'java.sql.SQLException:无法为连接URL创建类''的JDBC驱动程序'null'' at line: 'connection = dts。getConnection();' 现在我想它是要求连接的详细信息在server.xml中 –

+0

您的context.xml包含如下条目, ' ' – logztechstuff

+0

是的。我可以在context.xml中提供连接属性,并且应该可以工作。但我的问题是,如果我不想在context.xml中提供这些属性,如何从这里访问server.xml中定义的属性? –

0

在你的Server.xml文件中,我认为你需要在url中提供端口号。 例如url =“jdbc:mysql:// localhost:3306/storyBoard”

+0

我试过并得到这个错误: 'java.sql.SQLException:无法创建类''的JDBC驱动程序的连接URL'null'' –

+0

请确保您已添加jdbc驱动程序与您的项目 –