Spring Boot 自动重新配置在 spring-boot-data-starter-jdbc 上不起作用
Posted
技术标签:
【中文标题】Spring Boot 自动重新配置在 spring-boot-data-starter-jdbc 上不起作用【英文标题】:Spring Boot auto reconfiguration not working on spring-boot-data-starter-jdbc 【发布时间】:2019-10-27 11:48:21 【问题描述】:我正在尝试将 Spring Boot 应用程序部署到连接 Postgres 支持服务的 CF。我可以看到 db 属性在运行时没有被 VCAP env 替换。 我正在使用依赖项 - spring-boot-starter-jdbc(不是 spring-boot-starter-data-jpa,因为我打算使用 JDBC 模板而不是 JPA)。
步骤
在 pom.xml 中添加了以下 jars(spring-boot-starter-data-jpa,postgresql-driver)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
创建一个返回类型 DataSource 的 bean
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource()
@SuppressWarnings("rawtypes")
DataSourceBuilder builder = DataSourceBuilder.create();
return builder.build();
在 application.properties 中指定连接属性。
spring.datasource.jdbcUrl=jdbc:postgresql://localhost:5432/test
spring.datasource.username= dummy
spring.datasource.password=dummy
spring.datasource.platform=postgresql
有了这个本地设置工作正常。当应用程序部署到 Cloud Foundry 时,期望 spring 自动重新配置应该用 vcap 中的属性替换 bean。 但是这些值似乎没有被替换,系统尝试连接到 CF 上的 localhost 失败。
我查看了所有文档,它们似乎适用于 spring-boot-starter-data-jpa,但不适用于 jdbc。我可以看到在 JDBC 情况下自动重新配置不起作用。
感谢任何帮助。
感谢和问候, 维拉
【问题讨论】:
属性spring.datasource.url
不是这个吗?
我也尝试过 spring.datasource.url 但没有成功。
【参考方案1】:
我强烈建议您避免使用自动重新配置。演示很酷,但最终很难认真使用。这有点太神奇了,当它不起作用时很难调试,这就是你在这里遇到的。
还有其他几种方法可以做到这一点:
Spring Boot 将VCAP_SERVICES
公开为类似于vcap.services.<name>.credentials.username
的属性。您可以使用它们手动定义数据源。见here。将此与“云”配置文件相结合,可以轻松在本地和云之间切换。
您可以use Spring Cloud Connectors。当您使用 SCC 时,自动重新配置将自动退出。然后,您可以使用 SCC 挑选服务并从中获取数据源。
您可以使用新的java-cfenv 库,即intended to complement Spring Boot better。
【讨论】:
另请参阅此处对您的问题的评论:github.com/cloudfoundry/java-buildpack-auto-reconfiguration/…。通过属性混合 Spring Boot 自动配置和 Java Buildpack 自动重新配置不会达到你想要的效果。 @Daniel:感谢您的回答。我考虑过使用 spring 云连接器,但我想在本地测试和云测试方面保持简单的实现。现有实现 代码中不存在数据源 bean。维护 application.properties(jdbc url, user, password) 中的 db 参数在本地运行良好。在 Cloud Foundry 中运行时,自动重新配置会自动覆盖该属性,并且与云数据库的连接正常工作。 使用 Spring 云连接器,我相信我需要创建一个数据源 bean。如何使用 db (url,user,password) 的属性来实例化数据库连接?我如何确保代码在本地和云上运行而无需检查 mode==cloud 或 mode==local 之类的代码? @Veeraraghavan 您正在寻找的是个人资料:docs.spring.io/spring-boot/docs/current/reference/html/…。推荐的方法是直接在“本地”配置文件中设置spring.datasource...
属性,并包含 Daniel 上面提到的 java-cfenv
库,以便在 CF 上运行时自动设置这些属性。以上是关于Spring Boot 自动重新配置在 spring-boot-data-starter-jdbc 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Angular、spring-boot、maven 项目中配置项目以自动重新加载浏览器
运行 Spring Boot 应用程序时如何显示自动配置报告