javax.命名.NameNotFoundException | JNDI 查询

标签 java xml tomcat servlets

我在这个网站上发现了很多与已解决问题相关的问题和答案,但找不到解决我的问题的方法,所以最后不得不再次发布同样的问题!

我正在创建一个简单的 servlet DBCPDataSourceExample,并从我拥有的 DataSource 属性获取连接在 Apache Tomcat v8 应用程序服务器的 server.xmlcontext.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.xml Resource 映射:

<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.xml 资源映射:

 <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)

stacktrace 指向的代码行是这样的:

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

最佳答案

我们在 server.xml 中添加资源,同时我们需要创建一个资源链接,这是需要 context.xml 的地方。

在我们的例子中,我们将 context.xml 保存在 war 的 META-INF 中,示例条目如下所示

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

请验证您的 context.xml 条目。

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

关于javax.命名.NameNotFoundException | JNDI 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36856740/

相关文章:

python - 如何将嵌套 xml(与子项同名)解析为 CSV?

iphone - 如何使用 Xcode 从服务器读取 webService?

java - 无法启动 Tomcat 8 服务器 Eclipse

java - 尽管采用 json 编码,但所需参数不存在

java - 使用 Spring 3 过滤器在资源路径中嵌入时间戳?

php - 我究竟做错了什么?使用 php 创建 xml

java - 如何更改tomcat的上下文路径?

Java - Spring Ws - 在 XSD 文件中加载相对包含 (Tomcat 8)

java - 将几个 Java 循环替换为一个简单的 lambda,但看起来过于复杂

java - 如何检测以空格分隔的组