apache tomcat 7.0.30 datasourcerealm javax.naming.NameNotFoundException:名称 [jdbc/proto] 未绑定在此上下文中。找不

Posted

技术标签:

【中文标题】apache tomcat 7.0.30 datasourcerealm javax.naming.NameNotFoundException:名称 [jdbc/proto] 未绑定在此上下文中。找不到 [jdbc]【英文标题】:apache tomcat 7.0.30 datasourcerealm javax.naming.NameNotFoundException: Name [jdbc/proto] is not bound in this Context. Unable to find [jdbc] 【发布时间】:2012-09-11 04:11:19 【问题描述】:

让我先描述一下环境:

环境: - mac os x (java build 1.6.0_35-b10-428-11M3811) - Apache Tomcat 7.0.30 - mysql 5.5.27 - tomcat/lib --> mysql-connector-java-5.1.22-bin.jar

我已经成功实现了 JDBCRealm,并希望切换到 DataSourceRealm,因为它被推荐用于生产环境。我使用基于表单的身份验证。

我做了这里描述的一切: http://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html#DataSourceRealm 和这里: http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html#MySQL_DBCP_Example

server.xml

<Realm className="org.apache.catalina.realm.LockOutRealm">
     <Realm className="org.apache.catalina.realm.DataSourceRealm" 
            dataSourceName="jdbc/proto" digest="SHA-256" roleNameCol="role" 
            userCredCol="password" userNameCol="name" userRoleTable="roles" 
            userTable="users"/>
</Realm>

context.xml

<Resource auth="Container" 
          driverClassName="com.mysql.jdbc.Driver" 
          maxActive="100" maxIdle="30" maxWait="10000" 
          name="jdbc/proto" password="proto" type="javax.sql.DataSource" 
          url="jdbc:mysql://localhost:3306/proto" username="proto"/>

WEB-INF/web.xml

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

当我提交用户名和密码时,我得到以下异常:

Sep 18, 2012 9:38:32 PM org.apache.catalina.realm.DataSourceRealm open
SEVERE: Exception performing authentication
javax.naming.NameNotFoundException: Name [jdbc/proto] is not bound in this Context. Unable to find [jdbc].
at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
at org.apache.catalina.realm.DataSourceRealm.open(DataSourceRealm.java:394)
at org.apache.catalina.realm.DataSourceRealm.authenticate(DataSourceRealm.java:285)
at org.apache.catalina.realm.CombinedRealm.authenticate(CombinedRealm.java:146)
at org.apache.catalina.realm.LockOutRealm.authenticate(LockOutRealm.java:180)
at org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:295)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:450)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)

我没有尝试在不同的操作系统上设置环境来测试它是否是特定于 mac 的问题。

我错过了什么建议?我感谢您的帮助!谢谢。

【问题讨论】:

当我将条目从 context.xml 移动到 server.xml - --> 时它可以工作 -> 但我真的想要那个? 【参考方案1】:

为避免在 GlobalNamingResources 中声明资源,请将 localDataSource="true" 放入 Realm

【讨论】:

【参考方案2】:

在这种情况下,我相信这是因为您的领域(在这种情况下是在服务器级别声明的)正在尝试使用命名资源 jdbc/proto(在这种情况下是在Web 应用程序级别)

我理解的是java服务器上下文层次结构

    服务器 主机 WebApplication 上下文(可以在 server.xml 或 META-INF Context.xml 中)

【讨论】:

【参考方案3】:

实际上,这个[jdbc/proto] 在 ProjectName.xml 中被提及为类似

的属性
<ResourceLink global="jdbc/proto" name="jdbc/proto"/>

因此,请确保 ProjectName.xml 文件存在于 tomcatInstances/ServerName/conf/Catalina/localhost/ProjectName.xml 并具有此资源链接并且您的异常消失了。

我也遇到了同样的问题,应用程序的本地上下文文件由于某种原因从位置被删除了

tomcatInstances/ServerName/conf/Catalina/localhost/ProjectName.xml 

从后面恢复文件并完成...现在工作正常,希望这会对某人有所帮助。

【讨论】:

ProjectName.xml 中需要包含什么内容?【参考方案4】:

就我而言,问题是我的 pom.xml 中有一个冲突的依赖项。就我而言,它是 java-naming 依赖项。 确保您没有任何与 Tomcat 的命名库冲突的命名依赖项/jar。

在我删除它之后,问题就消失了(顺便说一句,环境与您相同)。

【讨论】:

以上是关于apache tomcat 7.0.30 datasourcerealm javax.naming.NameNotFoundException:名称 [jdbc/proto] 未绑定在此上下文中。找不的主要内容,如果未能解决你的问题,请参考以下文章

在 XAMPP 中将 PHP 7.0.9 升级到 PHP 7.0.30 后 Apache 未启动

Apache未启动在XAMPP中将PHP 7.0.9升级到PHP 7.0.30之后

如何在CentOS上安装Tomcat

cronolog切割apache和tomcat日志

linux部署tomcat8(基于centOS7)

升级tomcat需要更改哪些配置?