Tomcat的context.xml中的Resource name属性如何工作?

时间:2014-10-29 07:41:30

标签: tomcat jndi

我们正在使用JNDI来查找我们的数据库连接。在Tomcat的全局context.xml文件中,我们有类似于以下内容的内容:

<context>
    <Resource
        ...
        name="jdbc/mysql"
        ....
    />
</context>

(我刚才显示了我感兴趣的'name'属性。)

这适用于应用程序。

我们现在想为另一个应用程序添加另一个资源。然后我们的context.xml看起来如下:

<context>
    <Resource
        ...
        name="jdbc/mysql"
        ....
    />
    <Resource
        ...
        name="jdbc/mysql/otherapp"
        ....
    />

</context>

现在,使用该名称定义了这个额外的资源,Tomcat无法启动。基本上所有的Web应用程序都失败了。它给出了以下错误:

SEVERE: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/CallCycleSystem##1.0.4.201410241335]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:962)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1603)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.BasicDataSource cannot be cast to javax.naming.Context
    at org.apache.catalina.core.NamingContextListener.createSubcontexts(NamingContextListener.java:1249)
    at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1051)
    at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:671)
    at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:270)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5161)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 11 more

如果我将第二个资源的name属性从“jdbc / mysql / otherapp”更改为“jdbc / otherapp”,则Tomcat启动正常。

任何人都可以详细说明name属性的工作原理吗?为什么我之前收到错误? 查看文档here并没有给我太多帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

您基本上可以阅读如下:

for <Resource name="jdbc/MyDB" ... />:您正在创建名为 MyDB JDBC 资源,

for <Resource name="bean/MyBean" ... />:您正在创建名为 MyBean Java Bean 资源。

换句话说,名称编码为“ Resource_Type / Resource_Name