Cloudbees、Tomcat 和 Spring:“无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序”
Posted
技术标签:
【中文标题】Cloudbees、Tomcat 和 Spring:“无法为连接 URL \'null\' 创建类 \'\' 的 JDBC 驱动程序”【英文标题】:Cloudbees, Tomcat, and Spring: "Cannot create JDBC driver of class '' for connect URL 'null'"Cloudbees、Tomcat 和 Spring:“无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序” 【发布时间】:2012-11-27 02:51:59 【问题描述】:我正在尝试将我的 Spring MVC webapp(Hibernate 和 JPA)部署到 Cloudbees 中的 Tomcat 7 ClickStack,但似乎无法正确配置数据库连接。我尝试了多个教程(提供了许多解决方案),但都没有奏效。如果有人可以在下面查看我的配置文件并让我知道他们是否发现任何错误,我们将不胜感激。
错误:
java.lang.NullPointerException
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
首先,我使用 cloudbees cli 将我的数据库绑定到我的应用程序,这样我就不必在 cloudbees-web.xml 中声明它:
bees app:bind -a myapp/app -db mydatabase
application - myapp/app bound to cb-db:myapp/mydatabase as mydatabase
(我也尝试过解绑数据库并在 cloudbees-web.xml 和 context.xml 中定义它但没有成功)
spring-data.xml:
<jee:jndi-lookup id="datasource" jndi-name="jdbc/mydatabase"
lookup-on-startup="false" proxy-interface="javax.sql.DataSource"
cache="true" resource-ref="true" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="hibernate-jpa"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.mysql5Dialect"/>
<property name="showSql" value="false"/>
<property name="generateDdl" value="true"/>
</bean>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
</property>
</bean>
web.xml:
<resource-ref>
<res-ref-name>jdbc/mydatabase</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
我已经从我的 Maven 文件和 lib
文件夹中删除了所有对连接器的引用。搜索报错信息,一般是找不到驱动的问题……但是既然数据库是容器提供的,那我何必担心呢?
-- 编辑:工作 META-INF/context.xml 文件--
请注意,很多文档中引用的 com.cloudbees.jdbc.Driver 不起作用(引发了 classnotfound 异常),因此我不得不将 mysql-connector-java.jar 文件打包到 lib 文件夹中。另外,现在我只是硬编码了 url、用户名和密码,而不是设置它来使用系统属性。
<Context>
<Loader delegate="true"/>
<Resource
name="jdbc/mydatabase"
auth="Container"
type="javax.sql.DataSource"
maxActive="5"
maxIdle="2"
username="USERNAME"
maxWait="5000"
driverClassName="com.mysql.jdbc.Driver"
password="PASSWORD"
url="jdbc:mysql://MY_EC2_DB_URL:3306/mydatabase"/>
</Context>
【问题讨论】:
【参考方案1】:我遇到了同样的问题,终于设法“正确”配置数据源!
我正在使用 PropertyPlaceholderConfigurer,如下所示:
<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="database" value="MYSQL" />
<property name="generateDdl" value="false" />
</bean>
<context:property-placeholder system-properties-mode="FALLBACK" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="$dt4j.driver" />
<property name="url" value="$dt4j.url" />
<property name="username" value="$dt4j.username" />
<property name="password" value="$dt4j.password" />
</bean>
“FALLBACK”表示应根据任何本地属性解析占位符,然后再根据系统属性解析。
最后,我只需要添加系统属性(-Dprop=value)或将它们添加到 Cloudbees 部署器插件中即可使其工作。 肯定有更好的办法但是主要目的达到了:项目中没有硬编码数据源配置!
【讨论】:
【参考方案2】:不幸的是,此时 JNDI DB 设置尚未在 tomcat7 堆栈中为您完成。
当您将数据库绑定到您的应用时 - 它会注入一些系统属性:
MYSQL_PASSWORD_MYDB
MYSQL_URL_MYDB
MYSQL_USERNAME_MYDB
(MYDB 因为它是您的数据库资源的名称)。然后,您可以在您的代码/配置中引用它们。 对于 tomcat 7,您可以将 /META-INF/context.xml 放入您的应用程序中,这将设置 JNDI 数据源(请参阅http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html)
【讨论】:
谢谢,在 context.xml 中设置它是有效的(尽管我找不到如何将系统属性放入文件的参考)。对于将来阅读此内容的任何人,我将我的 context.xml 资源配置添加到票证中。 伟大的安迪 - 我不确定 tomcat 是否支持上下文中的系统属性 - 我怀疑他们支持(***.com/questions/372686/… - 这有什么意义)。 嗨!有关于 Tomcat7 堆栈的 JNDI DB 设置的任何消息吗?谢谢!以上是关于Cloudbees、Tomcat 和 Spring:“无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序”的主要内容,如果未能解决你的问题,请参考以下文章
Mercurial 插件、Jenkins 和 Cloudbees