jndiName配置

1.tomcat下先配置context.xml

<Resource auth="Container"

driverClassName="com.mysql.jdbc.Driver"
maxActive="100"
maxIdle="30"
maxWait="10000"
name="bookshare"
username="***"
password="**"

type="javax.sql.DataSource" url="jdbc:mysql://ip:端口/bookshare?useUnicode=true&amp;characterEncoding=UTF-8" />

2.在config.properties

jndiName = java:comp/env/bookshare

3.在db.xml

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${jndiName}">
</property>
</bean>

<context:property-placeholder location="WEB-INF/config.properties" />//装配config.properties文件到db.xml文件里


<think>我们正在处理关于JNDI名称找不到问题的解决方案。根据用户提供的引用信息,我们知道有一个配置示例,但用户可能遇到了JNDI名称解析失败的问题。 常见的JNDI名称找不到问题可能由以下原因引起: 1. JNDI名称配置错误,例如在Spring配置文件中指定的jndiName与在应用服务器中配置的JNDI名称不匹配。 2. 应用服务器没有正确配置数据源(或其他资源)的JNDI绑定。 3. 资源引用(resourceRef)的设置问题,当resourceRef为true时,JNDI名称会自动添加"java:comp/env/"前缀。 4. 部署环境问题,例如应用服务器未启动或数据源未部署。 解决方案: 1. 确认应用服务器中数据源的JNDI名称:登录应用服务器管理控制台,查看数据源的JNDI名称。例如,在Tomcat中,可以在context.xml中配置,并在server.xml或context.xml中查看。 2. 检查Spring配置文件中的jndiName:确保与服务器中配置的JNDI名称一致。注意,如果设置了resourceRef为true,则Spring会在名称前加上"java:comp/env/",因此配置jndiName应该是去掉这个前缀的部分(或者加上前缀,但将resourceRef设为false)。 例如: 如果服务器中的JNDI名称是"java:comp/env/test",那么可以: <property name="jndiName" value="java:comp/env/test"/> <property name="resourceRef" value="false"/> 或者,如果服务器中的JNDI名称是"test",并且你希望Spring自动添加前缀,那么: <property name="jndiName" value="test"/> <property name="resourceRef" value="true"/> 3. 确保应用服务器已经正确配置了数据源。例如,在Tomcat中,需要在context.xml中定义<Resource>,并在web.xml中配置<resource-ref>。 4. 检查应用服务器日志,确认数据源是否成功绑定到JNDI。 如果用户是在Tomcat中运行,以下是一个配置示例: 在Tomcat的context.xml(可以是全局的conf/context.xml,也可以是应用的META-INF/context.xml)中配置数据源: ```xml <Context> <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" username="root" password="password" maxActive="20" maxIdle="10" maxWait="-1"/> </Context> ``` 在web.xml中配置资源引用(可选,但如果你使用resourceRef=true,则需要): ```xml <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/test</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> ``` 在Spring配置文件中,可以这样配置: ```xml <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/jdbc/test"/> <!-- 或者使用value="jdbc/test"并设置resourceRef为true --> <!-- <property name="jndiName" value="jdbc/test"/> --> <!-- <property name="resourceRef" value="true"/> --> </bean> ``` 注意:在Tomcat中,如果使用<Resource>的name属性为"jdbc/test",那么它的全名就是"java:comp/env/jdbc/test"。因此,在Spring中,我们可以直接使用全名并将resourceRef设为false,或者使用短名并将resourceRef设为true(这样Spring会自动加上"java:comp/env/")。 如果问题仍然存在,请检查: - 应用服务器是否启动,数据源配置是否正确。 - 应用部署是否正确,是否部署到了配置了数据源的应用服务器上。 - 类路径中是否有数据库驱动。 如果使用的是其他应用服务器(如WebLogic, WebSphere, JBoss等),配置方式类似,但具体步骤可能有所不同。 通过以上步骤,通常可以解决JNDI名称找不到的问题。</think>### JNDI名称找不到问题的解决方法 JNDI名称找不到问题通常由配置错误或环境问题导致,以下是系统性的解决方案: #### 1. **检查JNDI名称拼写和上下文路径** - 确认Spring配置中的`jndiName`值与应用服务器中定义的JNDI名称**完全一致**(区分大小写) - 若使用`resourceRef=true`,实际查找的路径是`java:comp/env/` + 配置值 *例如:`<property name="jndiName" value="test"/>` 实际查找 `java:comp/env/test`* - 解决方案:通过应用服务器管理控制台验证JNDI名称 #### 2. **确认应用服务器配置** **Tomcat示例**(在`context.xml`中配置): ```xml <Resource name="jdbc/test" <!-- 此处name需与jndiName匹配 --> auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/db" username="user" password="pass"/> ``` **关键步骤**: - 重启服务器使配置生效 - 通过管理控制台检查JNDI树(如Tomcat的`/manager/jmxproxy`) #### 3. **检查类路径依赖** - 确保数据库驱动JAR包已放入应用服务器的`lib`目录 - 验证驱动版本兼容性(如MySQL使用`mysql-connector-java-8.x.jar`) #### 4. **Spring配置优化** ```xml <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <!-- 显式指定完整JNDI路径避免歧义 --> <property name="jndiName" value="java:comp/env/jdbc/test"/> <!-- 关闭自动添加前缀 --> <property name="resourceRef" value="false"/> </bean> ``` #### 5. **排查环境问题** - 在代码中手动查找JNDI(定位问题根源): ```java try { Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/test"); } catch (NamingException e) { e.printStackTrace(); // 查看具体错误 } ``` - 检查应用服务器日志(如Tomcat的`catalina.out`) #### 6. **Web应用特殊配置** 在`web.xml`中添加资源引用(Tomcat等容器需要): ```xml <resource-ref> <res-ref-name>jdbc/test</res-ref-name> <!-- 与context.xml中name一致 --> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> ``` > **根本原因总结**: > 80%的JNDI问题源于名称不匹配(如配置`test`但服务器注册为`jdbc/test`)或路径上下文错误。务必通过服务器管理界面直接验证JNDI树[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值