【发布时间】:2012-05-29 13:17:49
【问题描述】:
我正在尝试将 JSP / Hibernate 项目迁移到 GWT / Hibernate。简而言之,问题似乎是 jetty-env.xml 中的 MysqlConnectionPoolDataSource 类显然没有被实例化,导致来自 web.xml 的资源引用失败。
我们的 Hibernate 设置在非 GWT 项目中运行良好。我正在使用 Eclipse Indigo、Google Suite 插件 2.5、Google GWT Designer 2.4.2。
以下是我采取的步骤以及我认为重要的文件摘录。 (提前道歉 - 这有点冗长,但想确保我的问题是完整和清晰的。)
我的war/WEB-INF/classes/hibernate.cfg.xml包括:
<property name="hibernate.connection.datasource">
java:comp/env/jdbc/nndb
</property>
web.xml 包括:
<resource-ref>
<description>NN Database Connection Pooling</description>
<res-ref-name>jdbc/nndb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
我还按照here 的描述创建了 CustomJettyLauncher,并添加了 Eclipse 运行配置以使用它(运行配置参数 -server com....CustomJettyLauncher)这会导致:
jetty-6.1.x [WARN] NN Database Connection Poolingjdbc/nndbjavax.sql.DataSourceContainerShareable 的配置问题 java.lang.IllegalStateException: 没有绑定名称 javax.sql.DataSource/default
大概此时我需要在 jetty-env.xml 中定义资源的条目:
<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<New id="nndb" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>jdbc/nndb</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://dbserver/dbname</Set>
<Set name="User">dbuser</Set>
<Set name="Password">dbpasswd</Set>
</New>
</Arg>
</New>
</Configure>
但是上面的错误(Nothing to bind for name javax.sql.DataSource/default)仍然存在。有趣的是,如果我故意在 jetty-env.xml 中篡改数据源类名(例如 NOSUCH.com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource),则没有任何问题,因此它甚至可能不会尝试实例化该类。 (WebAppContext 和 Resource 的类似“跟踪器”错误确实会产生抱怨,所以它只是 ConnectionPoolDataSource 没有尝试实例化。)
哇!
有谁知道出了什么问题?任何建议将不胜感激。
提前致谢!
【问题讨论】:
-
你在哪里尝试实例化 PoolDataSource?客户端还是服务器端?
-
我根本不尝试在我的代码中实例化 MysqlConnectionPoolDataSource。据我了解这是如何工作的,我认为 Jetty 应该在启动服务时实例化 WebAppContext、Resource 和 MysqlConnectionPoolDataSource 本身。我认为这是在服务器端完成的。
-
假设您完全按照启动器教程进行操作,并且您的
WEB-INF/lib中有jetty-naming和jetty-plus罐子,我想知道您的jetty-env.xml是否被“构建”了 - 你能当项目构建并准备好启动时,验证它是否被复制到您的bin目录? -
WEB-INF/lib 有 jetty-naming 和 jetty-plus jar,WEB-INF 有 jetty-env.xml。我知道码头正在尝试使用 jetty-env.xml,因为如果我故意弄错 WebAppContext 和 Resource 的类名,它会抱怨,但如果我为 MysqlConnectionPoolDataSource 这样做,它不会抱怨,例如NOSUCH.com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource。
-
在这一点上我建议你走一下 Configuration#bindEntry() 的逻辑。在这里看一下:grepcode.com/file/repo1.maven.org/maven2/org.mortbay.jetty/…。它在默认为
/default之前经过了几跳,显然失败了。你必须弄清楚为什么其他尝试绑定失败,一旦你这样做了,你可能会知道答案。