Cloudbees, Tomcat, and Spring: "Cannot create JDBC driver of class for connect URL 'null'"



我正试图将我的Spring MVC Web应用程序(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文件夹中删除了所有jar。搜索错误消息表明,这通常与找不到驱动程序有关。。。但是既然数据库是由容器提供的,我为什么要担心呢?

--EDIT:工作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>

我也遇到了同样的问题,最终成功地"正确"配置了数据源!

我使用的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 deployer插件中即可使其工作。必须有更好的方法,但主要目标已经实现:数据源配置在项目中没有硬编码!

不幸的是,在tomcat7堆栈中,JNDI DB的设置还没有完成。

当你将数据库绑定到你的应用程序时,它会注入一些系统属性:

MYSQL_PASSWORD_MYDB 
MYSQL_URL_MYDB
MYSQL_USERNAME_MYDB

(MYDB,因为它是数据库资源的名称)。然后,您可以在代码/config中引用它们。对于tomcat 7,您可以将/META-INF/context.xml放入您的应用程序中,该应用程序将设置JNDI数据源(请参阅http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html)

相关内容

  • 没有找到相关文章

最新更新