java cfenv cloud foundry jdbc连接失败

67up9zun  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(525)

将spring应用程序部署到cloudfoundry。cloud foundry提供postgres服务,尝试使用java cfenv library application.properties进行jdbc连接:

database.url = #{cfJdbcEnv.findJdbcService().getJdbcUrl()}
database.username = #{ cfJdbcEnv.findJdbcService().getUsername() }
database.password = #{ cfJdbcEnv.findJdbcService().getPassword() }
database.driverClassName = #{cfJdbcEnv.findJdbcService().getDriverClassName()}

应用程序上下文.xml

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="localOverride" value="false" />
    <property name="locations">
        <list>
            <value>classpath:application.properties</value>
            <value>classpath:application-${spring.profiles.active}.properties</value>
        </list>
    </property>
</bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>

  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${database.driverClassName}" />
    <property name="url" value="${database.url}" />
    <property name="username" value="${database.username}" />
    <property name="password" value="${database.password}" />
  </bean>

pom.xml文件

<dependency>
  <groupId>io.pivotal.cfenv</groupId>
  <artifactId>java-cfenv-boot</artifactId>
  <version>2.2.2.RELEASE</version>
</dependency>

<dependency>
          <groupId>org.postgresql</groupId>
          <artifactId>postgresql</artifactId>
          <version>42.2.9</version>
        </dependency>

获取错误:

Caused by: java.sql.SQLException: No suitable driver found for postgres://postgres:7cpdezVdlt@apa-svc-xxxxxxxxxxxxx.apps.apa.comcast.net:5432/postgres
   2021-03-03T17:35:15.01-0500 [APP/PROC/WEB/0] OUT     at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:153) ~[spring-jdbc-4.0.3.RELEASE.jar:4.0.3.RELEASE]
   2021-03-03T17:35:15.01-0500 [APP/PROC/WEB/0] OUT     at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:144) ~[spring-jdbc-4.0.3.RELEASE.jar:4.0.3.RELEASE]
   2021-03-03T17:35:15.01-0500 [APP/PROC/WEB/0] OUT     at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:120) ~[spring-jdbc-4.0.3.RELEASE.jar:4.0.3.RELEASE]
   2021-03-03T17:35:15.01-0500 [APP/PROC/WEB/0] OUT     at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:380) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
   2021-03-03T17:35:15.01-0500 [APP/PROC/WEB/0] OUT     at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
   2021-03-03T17:35:15.01-0500 [APP/PROC/WEB/0] OUT     at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:171) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
   2021-03-03T17:35:15.01-0500 [APP/PROC/WEB/0] OUT     at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
   2021-03-03T17:35:15.01-0500 [APP/PROC/WEB/0] OUT     at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1435) ~[hibernate-core-4.3.5.Final.jar:4.3.5.Final]
   2021-03-03T17:35:16.00-0500 [APP/PROC/WEB/0] OUT [CONTAINER] org.hibernate.engine.jdbc.spi.SqlExceptionHelper   ERROR   No suitable driver found for postgres://postgres:7cpdezVdlt@apa-svc-cd1365a3-c6d0-436b-811d-23fc0ec66f0c.apps.apa.comcast.net:5432/postgres
   2021-03-03T17:35:16.00-0500 [APP/PROC/WEB/0] OUT [CONTAINER] org.hibernate.engine.jdbc.spi.SqlExceptionHelper   WARN    SQL Error: 0, SQLState: 08001

正在使用以下代码示例化数据源对象:

@Bean(name="dataSource")
    public DataSource getDataSource() { 

          DriverManagerDataSource dataSource = new DriverManagerDataSource();
          dataSource.setDriverClassName(driverClassName); 
          String url =
          cfEnv.findCredentialsByName("portal-db").getHost(); 
          String username = cfEnv.findCredentialsByName("portal-db").getUsername(); String
          password = cfEnv.findCredentialsByName("portal-db").getPassword();

        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl("jdbc:postgresql://"+url+":5432/postgres");
        dataSource.setUsername(username);
        dataSource.setPassword(password);
}

我不知道为什么从application.properties文件中读取database.url时,会出现与错误url相关的错误:postgres://postgres:x:5432/postgres

vxqlmq5t

vxqlmq5t1#

从错误消息中,它似乎得到了信息。它只是不识别您的服务代理提供的jdbc url。
我建议如下:
cf env (或者以其他方式查看env变量[1]),然后查看 VCAP_SERVICES . 查找您试图针对的属性,并确认ServiceBroker具有以开头的JDBCURL集 jdbc: 所有jdbc URL都应该以 jdbc: .
作为一个补充,我认为现在使用的格式与springcloudconnectors一起工作,springcloudconnectors的前身是javacfenv库。我相信它会自动插入 jdbc: 部分。您的代理可能指定了一个严格意义上不是jdbcurl的jdbcurl&这取决于scc来纠正。
如果您能够确认url缺少前导 jdbc: 然后您可以a.)联系您的服务代理的制造商(与cf集成的制造商)并要求他们解决此问题;b.)调整设置的方式 database.url 在application.properties中查看是否可以以正确的方式重新格式化它。
可能是这样的(虽然我没有测试):

database.url = jdbc:#{cfJdbcEnv.findJdbcService().getJdbcUrl()}

我相信这其中有一个已知的问题,明白吗https://github.com/pivotal-cf/java-cfenv/issues/127 还有一个代码提交链接。因此,一旦一个新版本被剪切,您就可以升级到那个版本了。您可以监视github问题以获取更多详细信息。更新此问题应在2.3.0+版本中修复。
[1] -您可以通过其他方式查看env变量: cf ssh 放入容器& cat /proc/<pid>/environ 或者通过Spring启动执行器转储env变量 /env 终结点。

相关问题