javax.naming.NameNotFoundException: 名称 [jdbc/mydb] 未在此上下文中绑定

javax.naming.NameNotFoundException: Name [jdbc/mydb] is not bound in this Context

我知道这个问题已经被问过好几次了。我找到了一些链接 here and here 作为我发现的示例。但是我尝试了他们的解决方案,我的问题还没有解决...

所以我复制我有的:

所以在我的项目中,物理上我有一个 .war 项目和一个 Servers 项目,当您在 Eclipse 中创建一个新的服务器时自动创建。

我尝试连接到本地 as400 db 但是当我这样做时,我发现了这个错误:

Error com.myprojectpackage.xxx: Name XXX is not bound in this Context

我尝试添加一个 ResourceLink,如我附加的其中一个链接所述:

 <ResourceLink name="jdbc/mydb"
         global="jdbc/mydb"
         type="javax.sql.DataSource" />

首先,我尝试像这样在我的应用程序中创建它:

  1. 在我的web.xml

    <resource-ref> <description>Datasource for my db</description> <res-ref-name>jdbc/mydb</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>

  2. 我创建了一个自定义 context.xml 文件并添加了

<ResourceLink name="jdbc/mydb" global="jdbc/mydb" type="javax.sql.DataSource" maxActive="50" maxIdle="30" maxWait="10000" username="myuser" password="mypass" auth="Container" driverClassName="com.ibm.as400.access.AS400JDBCDriver" url="jdbc:as400://192.168.1.1;naming=system;errors=full;" />

第一次尝试没有成功。所以我去了服务器端,并添加了以下内容:

  1. context.xml 文件中:

<ResourceLink name="jdbc/mydb" global="jdbc/mydb" type="javax.sql.DataSource" maxActive="50" maxIdle="30" maxWait="10000" username="myuser" password="mypass" auth="Container" driverClassName="com.ibm.as400.access.AS400JDBCDriver" url="jdbc:as400://192.168.1.1;naming=system;errors=full;" />

  1. server.xml中我在Context
  2. 中添加了相同的ResourceLink

第二次尝试也失败了。

所以,问题是什么?我该如何解决这个问题?

您的第一种方法失败了,因为您必须为您的数据源提供一个工厂 class,以便 Tomcat 成为 war 如何创建连接、使用什么驱动程序等等上。

第二个失败,因为没有正确使用 ResourceLink 元素。

如 Tomcat 的文档所述:

This element is used to create a link to a global JNDI resource.

相反,您应该在 META-INF/context.xml 文件中创建以下声明:

<Context>
    <Resource name="jdbc/mydb"
              global="jdbc/mydb" 
              type="javax.sql.DataSource" maxActive="50" maxIdle="30" 
              maxWait="10000" 
              username="myuser" password="mypass" auth="Container" 
              driverClassName="com.ibm.as400.access.AS400JDBCDriver" 
              url="jdbc:as400://192.168.1.1;naming=system;errors=full;"/>
</Context>

然后确保 META-INF 文件夹位于正确的位置 - 您必须将其包含在 [=26= 的 /webapp 文件夹中].war包.

现在您可以使用以下名称通过 JNDI 引用您的数据源:

"java:comp/env/jdbc/mydb"