javax.naming.NameNotFoundException: Name jdbc is not bound in this Context 的问题

本文详细介绍了如何解决在使用Eclipse运行Tomcat环境时遇到的javax.naming.NameNotFoundException错误,特别是针对web.xml文件配置问题及正确查找配置位置的指南。

javax.naming.NameNotFoundException: Name jdbc is not bound in this Context 错误的解决方法:

以下红色部分是网上的普遍解答:

web工程下的,WEB-INF下的web.xml添加这一段:

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

相对应的jsp或者java代码应该为:

DataSource ds = (DataSource) ctx.lookup("java:comp/env/JDBC/TestDB");

或者

Context envCtx = (Context) ctx.lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup("JDBC/TestDB");

不配置,或者配置错误,就会出现:Name jdbc is not bound in this Context,如果配置成 <res-ref-name>JDBC/Test222DB</res-ref-name>,则会报Name jdbc is not bound in this Context。

如果这里的配置对了,可能还会报其他错误,但至少不会报这个错了。

 

这个是没错的,但是如果你是用的Eclipse中的Tomcat运行的话,记得要配置的并不是Tomcat目录下Conf文件夹里面的web.xml,而是Eclipse项目中Server文件夹下的对应项目的web.xml文件。

### 异常原因分析 `javax.naming.NameNotFoundException` 和 `javax.naming.LinkException` 是 JNDI(Java Naming and Directory Interface)相关异常。以下是对这两种异常的详细分析和解决方案。 #### 1. `javax.naming.NameNotFoundException` 此异常表明在 JNDI 上下文中找不到指定的名称。根据引用内容,问题可能来源于以下几个方面[^2]: - **JNDI 数据源正确配置**:即使项目中没有显式使用 JNDI,某些框架(如 Spring)可能会尝试查找 JNDI 数据源。 - **Spring 配置错误**:如果 Spring 的配置文件中存在与 JNDI 相关的配置项,但实际环境中定义这些资源,就会抛出此异常。 - **依赖冲突**:某些 jar 包可能导致 Spring 内部逻辑错误地尝试加载 JNDI 资源。 解决方法包括: - 检查 Spring 配置文件,确保没有多余的 `<jee:jndi-lookup>` 或类似配置[^4]。 - 如果确实不需要 JNDI,可以在 `web.xml` 中添加上下文参数以明确环境: ```xml <context-param> <param-name>spring.profiles.active</param-name> <param-value>dev</param-value> </context-param> ``` - 确保数据库连接池(如 Druid)的配置正确,避免 Spring 错误地解析为 JNDI 数据源[^3]。 #### 2. `javax.naming.LinkException` 此异常通常表示 JNDI 查找过程中发生链接错误,可能是由于以下原因: - **网络问题**:JNDI 服务不可用或端口配置错误。 - **JNDI 上下文绑定失败**:例如,在 JBoss 中,服务绑定的端口号正确配置[^3]。 解决方案包括: - 检查 JNDI 服务是否启动,并验证其端口是否正确。例如,在 JBoss 中可以配置如下 Bean 来绑定命名服务端口: ```xml <bean class="org.jboss.services.binding.ServiceBindingMetadata"> <property name="serviceName">jboss:service=Naming</property> <property name="bindingName">Port</property> <property name="port">1099</property> <property name="description">The listening socket for the Naming service</property> </bean> ``` - 确保客户端和服务端的 JNDI 配置一致,例如 `jndi.properties` 文件中的 `java.naming.provider.url` 参数。 ### 示例代码 以下是配置 Druid 数据源时避免 JNDI 查找的示例代码: ```java @Bean public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mysql://localhost:3306/test"); dataSource.setUsername("root"); dataSource.setPassword("password"); return dataSource; } ``` ### 注意事项 - 如果仍然遇到问题,可以尝试启用 JNDI 调试日志以定位具体原因: ```properties -Djava.naming.debug=true ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值